2013-03-19 121 views
16

所以,我有一個非常簡單的函數,它有兩個參數:第一個是一個小時(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,我有錯誤,當我使用它時,我的代碼是正確的。爲什麼?

謝謝你的解釋!

+8

如果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

+2

@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

回答

22

您需要Eq約束,因爲你正在檢查h是否等於2312以及是否m等於59。你使用的是模式匹配,而不是==,但是對數字文字進行模式匹配仍然需要Eq(與模式匹配的構造函數不同)。

+1

O.K.我明白,謝謝你的解釋! – vildric 2013-03-20 00:03:30

相關問題