为什么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
,但它可以被读作Float
或Double
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?