2012-04-14 79 views
2

Haskell的新手,想知道爲什麼第一個3是確定,但第四聲明炸燬了:Haskell的閱讀類型推論

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只是民,但都必須是由於前三個命令可以工作,所以可以從read中返回,(+)應該可以在任何一對Nums上工作。這裏發生了什麼 ?

+0

您可以明確指定類型:'(read「5.3」:: Double)+ 5' – 2012-04-14 22:53:20

回答

9

當數值表達式的類型不明確時,Haskell會首先嚐試將其解析爲Integer,然後再將其解析爲Double(浮點數)(如果不起作用)。這是因爲要明確指定簡單算術表達式的類型是非常煩人的。

此具體例子的發生是因爲5.3不能是Integer(因爲Integer不是Fractional),因此它在這種情況下解析爲Double。但由於5可以是Integer,read "5.3"可以是任何可以讀取的類型,它默認爲Integer,並在運行時發生爆炸,因爲5.3不是有效的Integer文字。

如果您打開-Wall,您將能夠看到此類違約發生;它會在顯示時發出警告。 (但實際上,這實際上很煩人,因爲這種默認在GHCi中很常見。)

+0

感謝您的快速回答。現在我看到你無法做到(5 :: Float)+(5 :: Integer),並且我的第4條命令解決了這個問題。儘管如此,我很驚訝,推理打字不會嘗試其他分支 - 例如回去嘗試解決5到別的東西,至少在操作員內置的地方。 – tpascale 2012-04-14 23:17:38

+6

它不能「返回」,因爲類型檢查在執行前發生。並且字符串僅在執行過程中通過讀取進行檢查。 – augustss 2012-04-14 23:27:27