尝试:
Prelude> reads "7a7" :: [(Int, String)]
[(7,"a7")]
Prelude> reads "7e7" :: [(Int, String)]
[]
我测试了中间所有可能的角色。除了'e'
之外,它们都有效。似乎Haskell试图用科学记数法解释数字,但它不能,因为我要求Int
。
这对我来说似乎是个错误。
答案 0 :(得分:44)
GHC确实是马车。它的Numeric.readSigned
实现使用以下内容:
read'' r = do
(str,s) <- lex r
(n,"") <- readPos str
return (n,s)
lex
调用将尝试解析任何词位,这意味着对于&#34; 7e7&#34;它产生[("7e7", "")]
,因为&#34; 7e7&#34;对于浮点字面量来说,它是一个完整的词汇。然后它尝试从readPos
中获取完整的解析,在这种情况下是Numeric.readDec
传入的参数,readDec
将正确地产生[(7, "e7")]
对于字符串&#34; 7e7&#34;。这与(n, "")
的模式匹配失败,最终为[]
。
我认为它应该简单如下:
read'' = readPos
答案 1 :(得分:2)
7e7 :: Fractional a => a
因此无法将其视为Int
,但可以将其视为Float
或Double
。
ghci> :t 7e7
7e7 :: Fractional a => a
答案 2 :(得分:0)
您使用的是哪个版本的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>
这里有一个如何解释输入的模糊性。 通常我会想象&#34; 7e7&#34;作为70000000的Int将是完全可以接受的。编译器应该知道如何在第一个数字后分割字符串?