我有功能
sameElts :: Eq a => [a] -> Bool
,给定一个列表,当列表的所有元素相等时返回True,否则返回False。
例如:
sameElts [1,2] = False
sameElts [2,2] = True
sameElts [2] = True
任何人都可以解释Eq a =>
类型中代码片段sameElts
的必要性吗?我假设它将类型强制为数字列表,以便使用等于运算符。
答案 0 :(得分:8)
Eq a =>
代码段只需要类型类<{em> a
中的Eq
类型,这基本上意味着必须对此进行相等性测试类型。这允许您使用==
和/=
运算符。
例如,Numbers通过标准库(Prelude)实现了Eq
,但也有其他类型。您还可以创建自定义数据类型并自己定义相等性检查。这使得sameElts
非常通用,因为它适用于Eq
中的任何类型。
答案 1 :(得分:3)
如果没有Eq a
约束,sameElts
函数就不会知道任何有关列表中值的类型。特别是,它甚至不知道是否/如何比较(in-)相等的元素。
添加约束意味着只有实例化Eq
类的某种类型的值列表(即可以进行相等性比较的值)可以传递给sameElts
和{{1} }知道它可以在值上调用sameElts
类的所有函数部分(例如Eq
)。