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