2015-11-03 85 views
3

這個微小的Haskell程序從控制檯讀取兩個空間分隔的數字,並打印他們的總和:爲什麼Integer在類型變量應該模糊時被推斷?

main = do 
    line <- getLine 
    let n1:n2:_ = map read $ words line 
    print $ n1 + n2 

,我期望,因爲含糊不清的編譯失敗:+限制的n1n2類型Num類型類和不是特定的類型。然而,GHC 7.10成功編譯它,推斷出Integer類型(替換+, /將推斷類型更改爲Double)。對此的解釋是什麼?

+1

我知道關聯問題中的答案提到了違約,但仍然將問題標記爲「單態限制是什麼?」的副本。由於單態限制在這裏不重要,因此是誤導性的。 –

回答

4

Haskell有一個特殊情況,用於處理數字類(NumFractional和其他幾個),它爲不明確的類型變量選擇默認類型。 (有關更多詳細信息,請參見2010 report。)

它的工作方式是嘗試一系列數字類型,直到滿足所有約束。默認情況下,它會首先嚐試Integer,然後Double,但你還可以控制這對每個模塊爲基礎:

default (Int, Rational) 

如果你想關閉默認關閉你的模塊,就是不給它任何類型:

default() 

說實話,這是一個很大的破解使得Haskell更容易用作計算器。但它確實使生活變得更容易一些,因爲我們不必在像你這樣的程序中明確地註釋文字的類型,這也會令人困惑。

相關問題