簡體   English   中英

為什么haskell使用一種ReadS來表示一個函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM