等式=> Haskell中的函数

时间:2019-04-08 19:04:45

标签: haskell recursion

我试图弄清楚如何用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。

谢谢。

2 个答案:

答案 0 :(得分:4)

您的类型中存在Eq类型类是一个红色的鲱鱼:它与您报告的错误无关。您报告此错误的原因是,您已定义了当列表为空(f [] =)且列表至少包含两个元素(f (x:x':xs) =)时函数的行为,但未定义当列表完全为空时的函数行为一个元素。解决方案是添加一个开始的案例*

f [x] = ????

并决定如何处理一个元素列表。或者找到其他方式编写处理所有情况的函数。


*请注意,f [x]f (x:[])是同一件事。

答案 1 :(得分:1)

您还可以使用span和递归调用使其起作用:

f :: Eq a => [a] -> [[a]]
f [] = []
f l@(x:xs) = grouped : f remainder
    where
        (grouped, remainder) = span (== x) l

这里有live example