我可以做以下事情:
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
会返回一个列表?
答案 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
中返回多个项目。我没有遇到过有意义的情况,但这是可能的。