haskell - Haskell 的 `reads` 在什么情况下会返回多个列表项?

标签 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来读取这些内容。但我从来没有读到过返回列表中多个元组的情况。为什么reads返回一个列表?

最佳答案

没有一个标准实例这样做,但它是用于不明确的解析;因为这实际上并不是很有用,并且使用此功能的解析器效率非常低,reads的返回值对于所有实际目的都是 a 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"

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

关于haskell - Haskell 的 `reads` 在什么情况下会返回多个列表项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689560/

相关文章:

haskell - 伦菲尔德 : How Do I Get This Traversal To Work?

haskell - 我如何强制 Parsec 返回错误?

haskell : loading ALL files in current directory path

haskell - 如何将数据类型带入值(value)级别?

haskell - OCaml 中的有序变体类型和子类型

haskell - 如何在 Haskell 中解析整数矩阵?

list - 如何将具有重复项的数组转换为具有重复项总和的数组?

list - 如何测试一个列表中的整数是否可以被另一个列表中的整数整除?

haskell - 使用 ghc 编译但不使用 cabal new-run 编译的代码

haskell - 如何告诉 Haskell 不要从两个模块导入同一个实例?