字符串-为什么Haskell无法读取“ 7e7”但能够读取“ 7a7”?

试着做:

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

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

我在中间测试了所有可能的字符。 除'e'外,它们都起作用。似乎Haskell试图用科学计数法解释该数字,但这不能,因为我要的是Int

对我来说似乎是个虫子。

romeovs asked 2020-02-12T17:57:32Z
3个解决方案
44 votes

GHC确实是越野车。 其lex912的实现使用以下内容:

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

2744627779705766766912调用将尝试解析任何词素,这意味着对于“ 7e7”它会产生2744627779705766766913,因为“ 7e7”是浮点常量的整个词素。 然后,它尝试从readPos中获取一个完整的解析,在这种情况下,这是一个传入Numeric.readDec的参数,并且readDec将为字符串“ 7e7”正确产生[(7, "e7")]。 这将导致模式匹配2744627779705766766918失败,最终变为[]

我认为应该简单地如下:

read'' = readPos
R. Martinho Fernandes answered 2020-02-12T17:57:58Z
2 votes

7e7 :: Fractional a => a,因此无法将其理解为Int,但可以将其理解为FloatDouble

ghci> :t 7e7
7e7 :: Fractional a => a
David answered 2020-02-12T17:58:18Z
0 votes

您正在使用哪个版本的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”解释为70000000。 编译器应该如何知道在第一位数字后拆分字符串?

Bobble answered 2020-02-12T17:58:48Z
translate from https://stackoverflow.com:/questions/22689122/why-is-haskell-unable-to-read-7e7-but-able-to-read-7a7