2

Haskell 新手想知道为什么前 3 条没问题,但第 4 条语句被炸毁了:

Prelude> read "5.3" + 5.0                   -- ok
10.3

Prelude> read "5"   + 5                     -- ok
10

Prelude> read "5"   + 5.3                   -- ok
10.3

Prelude> read "5.3" + 5                     -- huh ???
*** Exception: Prelude.read: no parse

我看到 :t 5.3 是分数,而 5 只是 Num,但两者都必须可以从 read 中返回,因为前三个命令有效,并且 (+) 应该适用于任何一对数字。这里发生了什么 ?

4

1 回答 1

9

当数值表达式的类型不明确时,Haskell 会首先尝试将其解析为Integer,然后再解析为Double(浮点数),如果这不起作用。这是因为必须显式指定简单算术表达式的类型会很烦人。

这个具体的例子发生是因为5.3不能是Integer(因为Integer不是Fractional),所以在这种情况下它解决了Double。但是由于5可以是Integer, 并且read "5.3"可以是任何可以读取的类型,它默认为Integer,并且在运行时爆炸,因为5.3它不是有效的Integer文字。

如果你打开-Wall,你将能够看到这种类型的默认发生;它会在它发生时显示警告。(不过,这在实践中通常很烦人,因为这种默认设置在 GHCi 中很常见。)

于 2012-04-14T22:50:25.553 回答