16

所以,我有一个非常简单的函数,它有两个参数:第一个是一小时(0 到 23 之间),第二个是一分钟(0 到 59 之间)。此函数返回小时加一分钟,并以漂亮的样式格式化小时。例如,hour 11 12返回11 heures et 13 minutes。抱歉,小时的法语格式。

所以,我在这个函数中使用了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,我有一个错误,当我使用它时,我的代码是正确的。为什么?

谢谢你的解释!

4

1 回答 1

22

您需要Eq约束,因为您正在检查是否h等于2312以及是否m等于59。您使用的是模式匹配,而不是==,但是仍然需要以这种方式对数字文字进行Eq模式匹配(与对构造函数的模式匹配不同)。

于 2013-03-19T23:41:40.980 回答