所以,我有一个非常简单的函数,它有两个参数:第一个是小时(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
,我就会出错,当我使用它时,我的代码是正确的。为什么呢?
感谢您的解释!
答案 0 :(得分:22)
您需要Eq
约束,因为您要检查h
是否等于23
或12
以及m
是否等于{{1} }}。你是使用模式匹配而不是59
来做的,但是对数字文字的模式匹配仍然需要==
(与构造函数的模式匹配不同)。