reads "(1,2) (3,4)" :: [(-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:25:33 25 4
gpt4 key购买 nike

我可以执行以下操作:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com