通過「從第一原理哈斯克爾編程」的工作,我的回答感到迷惑不解以下問題:哈斯克爾返回類型混亂
如果
kessel
類型爲(Ord a, Num b) => a -> b -> a
,那麼kessel 1 2
類型是一個)
Integer
b)中Int
C)a
d)(Num a, Ord a) => a
E)Ord a => a
F)Num a => a
答案是d) - 但我認爲答案應該是E),因爲在類型簽名的第一個參數,唯一的要求(a)爲它是一個Ord
。那麼,爲什麼不回報?
kessel 'd' 2
是有效的,這是Char
類型 - 一無所知Num
!
我不明白什麼?
謝謝你的幫助。
我們要求'Num a'以便'1 :: a'有意義。 –
作爲一個側面說明,這個問題真的很糟糕:「正確」的答案很大程度上取決於Haskell類型系統的一些不太有趣的變化,特別是默認和數字字面多態性,並取決於你如何解釋這個問題還有單態限制。如果你對'Num b'約束使用了一個不同於'Num'的類(當然還有一個適當的'2'的替代參數),那麼正確答案可能就是「這是一個模糊的類型錯誤」,如果你在文件中寫入'foo = kessel 1 2',並向ghci詢問它的類型,它會告訴你'foo :: Integer'! –
......而且要明確,通過「這個問題」,我並不是說你要問的問題很糟糕。我認爲你在設置你的問題方面做得很好。我在說「來自第一校長的Haskell編程」這個問題令人困惑,並且(在我看來)是一個嚴重的問題。 –