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

时间:2014-03-27 13:28:42

标签: string haskell

尝试:

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

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

我测试了中间所有可能的角色。除了'e'之外,它们都有效。似乎Haskell试图用科学记数法解释数字,但它不能,因为我要求Int

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

3 个答案:

答案 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,但可以将其视为FloatDouble

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将是完全可以接受的。编译器应该知道如何在第一个数字后分割字符串?