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。这是怎么回事?
答案 0 :(得分:9)
当数值表达式的类型不明确时,Haskell会尝试先将其解析为Integer
,然后再解析为Double
(浮点数),如果这不起作用。这是因为必须明确指定简单算术表达式的类型会非常烦人。
此具体示例的发生是因为5.3
不能是Integer
(因为Integer
不是Fractional
),所以它解析为Double
案件。但由于5
可以是Integer
,read "5.3"
可以是任何可以读取的类型,因此默认为Integer
,并在运行时爆炸,因为{{1} }}不是有效的5.3
文字。
如果您打开Integer
,您将能够看到此类型的默认值发生;它会显示警告。 (但这在实践中通常很烦人,因为这种违约在GHCi中很常见。)