[英]Why haskell use a type of ReadS a to represent a function?
我讀的源代碼的reads
。 reads
被定義為reads :: Read a => ReadS a
因此它只返回ReadS a
而a必須是Read
的實例。
和ReadS a
被定義為type ReadS a = String -> [(a, String)]
,所以從返回的事情reads
僅僅是取一個字符串並返回的元組的陣列的功能。
然后我想知道為什么只定義沒有ReadS的reads
a 。 就像reads :: Read a => (String -> [(a, String)])
事物的解析器
是一個來自字符串的函數
到對的列表
事物和弦樂!- 各種來源
它有助於推理程序在其意圖方面考慮抽象,而不是實現。 所以是的,同時type ReadS a = String -> [(a, String)]
,這是解析事物的實際目標和將ReadS
解析器鏈接在一起的次要因素。 正如Rhymoid指出:
composeReads :: ReadS a -> ReadS b -> ReadS (a,b)
傳達解析器組合的意圖,並且作為一個快樂的副作用比內聯等效更簡潔:
composeReads
:: (String -> [(a, String)])
-> (String -> [(b, String)])
-> (String -> [((a, b), String)])
分解這種重復是一件好事而且顯而易見的事情,不僅僅是因為避免重復是有益的,而且還要盡可能多地增加每行有用語義內容的數量。 如果我們想要改變這些解析器的實現方式,那么將它們封裝在這個別名后面是一個小步驟,可以讓我們避免對每個使用站點進行大量更改。
您可以在各種解析器組合庫中重復這一點,例如Parsec,Attoparsec和uu-parsinglib。 一個Parser
是一個Parser
是一個Parser
,而更像是一個黑盒子這些東西,越容易與它們的使用發揮並分別 implementation-。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.