繁体   English   中英

等式=> Haskell中的函数

[英]Eq => function in Haskell

我试图弄清楚如何用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类型类是一个红色的鲱鱼:它与您报告的错误无关。 报告错误的原因是,您定义了当列表为空( f [] = )且列表中至少包含两个元素( f (x:x':xs) = )时f (x:x':xs) = ,但没有定义何时该列表仅包含一个元素。 解决方案是添加一个开始的案例*

f [x] = ????

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


*请注意, f [x]f (x:[])

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

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

这里有现场示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM