default()
h :: Bool
h = 1.0 == 1.0 --Error. Ambiguity.
不能編譯。這是預料之中的,因爲有歧義。它可以是Float
或Double
,Haskell不知道我們想要哪一個。
但代碼
default()
foo :: (Fractional a, Eq a) => a -> Bool
foo x = x == 1.0
編譯成功。我不完全明白爲什麼。爲什麼這也不明確?
我有一種感覺,這是因爲每當我們稱之爲foo
,我們都保證有回升代替a
,即具體類型,我們都保證有固定a
到Float
或Double
(或我們的定製型兩種在編譯時具有Fractional
和Eq
的實例),因此不存在歧義。
但這只是一種感覺,我不知道它是否100%準確。
@Carsten兩者都不在'Eq'中;這是非法的,因爲選擇一個可以給出與其他結果不同的結果(當然,這個程序當然不會,但編譯器不會,也不應該知道這一點)。 –
@AlexeyRomanov好後悔...... – Carsten
你能說仔細爲什麼這不是一個重複的[您剛纔的問題(http://stackoverflow.com/q/34776282/791604)? –