2011-12-31 51 views
19

我可以做到以下幾點:Haskell的`reads`在哪些場景下返回多個列表項?

Prelude> reads "1 2 3" :: [(Int, String)] 
[(1," 2 3")] 
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)] 
[((1,2)," (3,4)")] 
Prelude> reads "(1,2)(3,4)" :: [((Int, Int), String)] 
[((1,2),"(3,4)")] 
Prelude> reads "(1,2)\n(3,4)" :: [((Int, Int), String)] 
[((1,2),"\n(3,4)")] 
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)] 
[((1,2)," (3,4)")] 

我可以得出Read並得到讀取讀取這些呢。但是我從來沒有得到過讀取來返回列表中的多個元組。爲什麼reads返回列表?

回答

16

沒有標準實例這樣做,但它的目的是模糊分析;因爲這不是非常有用,並且使用此功能的解析器效率非常低,所以reads的返回值實際上是作爲[]僞裝成Maybe

Report's definition of read揭示了多個解析的本意:

read :: (Read a) => String -> a 
read s = case [x | (x,t) <- reads s, ("","") <- lex t] of 
       [x] -> x 
       [] -> error "PreludeText.read: no parse" 
       _ -> error "PreludeText.read: ambiguous parse" 

所以:由於歷史的原因,基本上是這樣。

+0

感謝您的澄清。需要知道我是否錯過了一些東西。 – Ana 2011-12-31 18:04:20

3

您可以爲您的數據類型定義Read實例,該實例可能返回reads中的多個項目。我沒有遇到過這種情況,但這是可能的。