尝试做:
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
,但可以读作Float
或Double
。
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 是完全可以接受的。编译器应该如何知道在第一个数字之后拆分字符串?