2012-03-26 100 views
4

在GHCI下面的代碼工作正常:擁抱`/`與類型推斷

f1 :: Float 
f1 = f2 

-- f2 :: Float 
f2 = 1/1 

但在擁抱,我得到一個類型的錯誤 - 它希望成爲一個雙。當我取消註釋f2的類型簽名時,它工作正常。

不應該完全照顧類型推斷嗎?

這是Hugs中的錯誤嗎?

我簽出的/的類型和Double實例和Float - /作品上Fractional S,並且有兩個DoubleFloat一個分數的實例,所以這不應該成爲問題。

回答

7

當沒有鍵入簽名時,f2具有多態性推斷類型(Fractional a => a),由於單態限制(除非禁用),必須進行單態化。在沒有其他默認聲明的情況下,具有Fractional約束的類型變量默認爲Double。 Hugs似乎首先進行違約,然後扼殺將聲明的Floatf1Doublef2綁定的企圖。 GHC看起來更進一步,看到f2用於Float類型,因此單形態爲f2Float

我不知道我想什麼樣的行爲語言標準規定在這種情況下,但GHC的是正確的,因爲monomorphising應鍵入結合基團後纔會出現,我認爲f1f2一起形成約束力組,因爲f1使用f2