在Haskell中,为什么使用Eq a =>是重要的。 [a]之前的功能如下?

时间:2016-05-23 06:29:40

标签: haskell functional-programming

我有功能

sameElts :: Eq a => [a] -> Bool 

,给定一个列表,当列表的所有元素相等时返回True,否则返回False。

例如:

sameElts [1,2] = False
sameElts [2,2] = True
sameElts [2] = True

任何人都可以解释Eq a =>类型中代码片段sameElts的必要性吗?我假设它将类型强制为数字列表,以便使用等于运算符。

2 个答案:

答案 0 :(得分:8)

Eq a =>代码段只需要类型类<{em> a中的Eq类型,这基本上意味着必须对此进行相等性测试类型。这允许您使用==/=运算符。

例如,Numbers通过标准库(Prelude)实现了Eq,但也有其他类型。您还可以创建自定义数据类型并自己定义相等性检查。这使得sameElts非常通用,因为它适用于Eq中的任何类型。

答案 1 :(得分:3)

如果没有Eq a约束,sameElts函数就不会知道任何有关列表中值的类型。特别是,它甚至不知道是否/如何比较(in-)相等的元素。

添加约束意味着只有实例化Eq类的某种类型的值列表(即可以进行相等性比较的值)可以传递给sameElts和{{1} }知道它可以在值上调用sameElts类的所有函数部分(例如Eq)。