为什么哈斯克尔看不懂"7e7"却能读懂"7a7"?



尝试做:

Prelude> reads "7a7" :: [(Int, String)]
[(7,"a7")]
Prelude> reads "7e7" :: [(Int, String)]
[]

我针对中间所有可能的角色对此进行了测试。除了'e'之外,它们都工作。似乎哈斯克尔试图用科学记数法解释这个数字,但不能,因为我要求Int

这对我来说似乎是一个错误。

GHC确实有问题。其Numeric.readSigned实现使用以下方法:

read'' r = do
    (str,s) <- lex r
    (n,"")  <- readPos str
    return (n,s)

lex调用将尝试解析任何词素,这意味着对于"7e7",它会产生[("7e7", "")],因为"7e7"是浮点文字的完整词素。然后它试图从readPos中获取一个完整的解析,在这种情况下,这是一个Numeric.readDec被传入的参数,readDec将正确地为字符串"7e7"生成[(7, "e7")]。这不符合与(n, "")的模式匹配,最终为 []

我认为应该简单地如下:

read'' = readPos

7e7 :: Fractional a => a所以它不能读作Int,但可以读作FloatDouble

ghci> :t 7e7
7e7 :: Fractional a => a

您使用的是哪个版本的 GHC?

这是我设置的终端会话的(编辑(输出:

GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Prelude> reads "7a7" :: [(Int, String)]
[(7,"a7")]
Prelude> reads "7e7" :: [(Int, String)]
[(70000000,"")]
Prelude> 

这里在如何解释输入方面存在歧义。通常我认为将"7e7"解释为 Int 70000000 是完全可以接受的。编译器应该如何知道在第一个数字之后拆分字符串?

最新更新