在什么情况下Haskell的`读取'返回多个列表项?

时间:2011-12-31 17:38:39

标签: haskell

我可以做以下事情:

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会返回一个列表?

2 个答案:

答案 0 :(得分: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"

所以:历史原因,基本上。

答案 1 :(得分:3)

您可以为数据类型定义Read个实例,这些实例可以在reads中返回多个项目。我没有遇到过有意义的情况,但这是可能的。