为什么Haskell无法读取“7e7”,却能读取“7a7”?

试着做:

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

我在中间testing了所有可能的人物。 他们都工作,除了'e' 。 哈斯克尔似乎试图用科学记数法来解释这个数字,但它不能因为我要求的是整数。

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

GHC确实是越野车。 它的Numeric.readSigned实现使用以下内容:

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

lex调用将尝试parsing任何语义,这意味着对于“7e7”它会产生[("7e7", "")] ,因为“7e7”是浮点数字的整个语言。 然后它试图从readPos获得一个完整的parsing,在这种情况下,它是一个参数, Numeric.readDec被传入, readDec将正确地产生string“7e7”的[(7, "e7")] 。 与(n, "")模式匹配失败,并以[]结束。

觉得应该简单如下:

 read'' = readPos 

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

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

你正在使用哪个版本的GHC?

以下是我的设置中terminal会话的(编辑)输出:

 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> 

在这里如何解释input是不明确的。 通常我想像“7e7”的解释是一个70000000的诠释将是完全可以接受的。 编译器应该如何知道在第一个数字之后拆分string?