【发布时间】:2019-08-29 23:59:33
【问题描述】:
我想弄清楚如何用 Haskell 中的 Eq 函数编写这个函数。
我尝试实现的一个简单功能是:
f :: Eq a => [a] -> [[a]]
其中 f 会将每个重复的连续元素聚集在单独的子列表下,例如:
f [3] = [[3]]
f [1,1,1,3,2,2,1,1,1,1] = [[1,1,1],[3],[2,2],[1,1,1,1]]
我想过这个功能:
f :: Eq a => [a] -> [[a]]
f [] = []
f (x:[]) = [[x]]
f (x:x':xs) = if x == x' then [[x, x']] ++ (f (xs))
else [[x]] ++ (bundler (xs))
它似乎不能很好地工作,因为当它到达最后一个元素时,它想将它与它的连续元素进行比较,这显然不存在。
此外,我觉得我没有使用 Eq => 函数。
我想收到一个答案,说明如何在我的情况下正确使用 Eq。
提前致谢。
【问题讨论】:
-
"我觉得我没有使用 Eq => 函数。"您正在使用
==,它在Eq类型类中定义。如果没有Eq约束,则不能使用==。所以你正在正确使用Eq。 -
所以当我使用 Eq 时,它可以让我使用 ==,对于 + 和 - 等也一样?
-
+和-在Num中定义。 -
类型类是函数名称(及其类型)的集合。
Eq类提供==函数名。类型类的实例是特定类型的那些命名函数的实现。因此,当您说Eq a => [a]时,您所说的是“其元素类型具有定义的==函数的列表”。当您说Num a => a时,您所说的是“实现了+和*以及Num的其他功能的类型。 -
您的问题与
Eq类型类无关。您可以通过将其类型更改为使用实现Eq的具体类型来看到这一点,例如f :: [Int] -> [[Int]]。你还是会遇到同样的问题,而且周围没有Eq。