Haskell读取类型推断

时间:2012-04-14 22:48:39

标签: haskell

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是Fractional而5只是Num,但两者都必须可以从read中返回,因为前三个命令有效,而(+)应该适用于任何一对Nums。这是怎么回事?

1 个答案:

答案 0 :(得分:9)

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

此具体示例的发生是因为5.3不能是Integer(因为Integer不是Fractional),所以它解析为Double案件。但由于5可以是Integerread "5.3"可以是任何可以读取的类型,因此默认为Integer,并在运行时爆炸,因为{{1} }}不是有效的5.3文字。

如果您打开Integer,您将能够看到此类型的默认值发生;它会显示警告。 (但这在实践中通常很烦人,因为这种违约在GHCi中很常见。)