所以,我有一个非常简单的函数,它有两个参数:第一个是一个小时(在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
,我就会出错,当我使用它时,我的代码是正确的。为什么?
谢谢你的解释!
发布于 2013-03-20 07:41:41
您需要Eq
约束,因为您要检查h
是否等于23
或12
,以及m
是否等于59
。您使用的是模式匹配,而不是==
,但是针对数字文字的模式匹配仍然需要Eq
(与针对构造函数的模式匹配不同)。
https://stackoverflow.com/questions/15512541
复制相似问题