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

Ana*_*Ana 19 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)")]
Run Code Online (Sandbox Code Playgroud)

我可以派生Read并阅读以阅读这些内容.但是我从来没有得到过读取来返回列表中的多个元组.为什么要reads返回一个清单?

ehi*_*ird 16

没有一个标准实例这样做,但是它用于模糊的解析; 因为这不是非常有用,并且使用此功能的解析器效率非常低,所以reads返回值对于所有实际目的而言都是Maybe伪装成的[].

报告的定义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"
Run Code Online (Sandbox Code Playgroud)

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