所以,我有一個非常簡單的函數,它有兩個參數:第一個是一個小時(0到23之間),第二個是一個分鐘(0到59之間)。此功能返回小時加一分鐘,並以美麗的樣式格式化小時。例如,hour 11 12
返回11 heures et 13 minutes
。對不起,法國格式的小時。爲什麼在不使用「==」的情況下添加「Eq」類型約束?
所以,我在這個函數中使用show
函數,並且參數需要是一個數字,所以我的類型聲明爲(Num a, Show a) => a -> a -> String
。但是,當我嘗試函數時,出現錯誤,GHC向我說要添加Eq
類型約束,但我不明白爲什麼在這種情況下需要Eq
類型約束。還有就是代碼(同樣,在函數中使用法文文本抱歉,但我認爲,如果你不明白函數名和文本它不是很重要):
heure :: (Num a, Eq a, Show a) => a -> a -> String
heure 23 59 = "Minuit"
heure 12 m = "Midi et " ++ show (m+1) ++ " minutes"
heure h 59 = show (h+1) ++ " heures"
heure h m = show h ++ " heures et " ++ show (m+1) ++ " minutes"
所以:如果我不要使用Eq
,我有錯誤,當我使用它時,我的代碼是正確的。爲什麼?
謝謝你的解釋!
如果v == k,匹配數值,字符或字符串文字模式k與值v成功,其中==基於模式的類型被重載。請參見[Haskell 2010語言報告3.17.2模式匹配的非形式語義](http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17) – nymk 2013-03-19 23:44:59
@nymk:[2010年報告第6.4節] (http://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1350006.4)說:「數字類型的類」Num「是」Eq「的一個子類,因爲所有數字都可以進行比較爲了平等。「但是這裏發生的是[GHC的最新版本不這樣做](http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/release-7-4-1.html ):「Num'類不再具有'Eq'或'Show'超類,因此許多其他的類和函數都獲得了明確的'Eq'或'Show'約束,而不是依賴'Num'約束來提供他們。「 – 2013-03-20 18:56:29