Haskell组函数/始终缺少第一个元素

Haskell组函数/始终缺少第一个元素,haskell,grouping,Haskell,Grouping,我想编写一个名为group的函数,它接受类型为[a]的列表,并返回包含相同字符的类型为[[a]]的列表。以下是预期行为的简单示例: 组[1,1,2,1,3,3]⇒+ [[1,1],[2],[1],[3,3,3]] 组“aaabbcddd”⇒+ [“aaa”、“bb”、“c”、“dddd”] 我编写了以下代码,但问题是该代码总是错过原始列表中的第一个元素 group [] = [] group (x:xs) = groupHelper xs x [] groupHelper :: Eq a =&

我想编写一个名为group的函数,它接受类型为
[a]
的列表,并返回包含相同字符的类型为
[[a]]
的列表。以下是预期行为的简单示例:

组[1,1,2,1,3,3]
⇒+ <代码>[[1,1],[2],[1],[3,3,3]]

组“aaabbcddd”
⇒+ <代码>[“aaa”、“bb”、“c”、“dddd”]

我编写了以下代码,但问题是该代码总是错过原始列表中的第一个元素

group [] = []
group (x:xs) = groupHelper xs x []

groupHelper :: Eq a => [a] -> a -> [[a]] -> [[a]]
groupHelper [] prev fs = fs
groupHelper (x:xs) prev [] = groupHelper xs prev [[x]]
groupHelper (x:xs) prev fs = if (x == prev) then groupHelper (xs) (x) ((init fs) ++ [(last(fs)++[x])]) 
     else groupHelper (xs) x (fs++[[x]])
代码将为此输入生成以下输出

组[1,1,2,1,3,3]
⇒+ <代码>[[1]、[2]、[1]、[3,3,3]]

=>此处第一个列表开头的1将丢失


组“aaabbcddd”
⇒+ <代码>[“aa”、“bb”、“c”、“dddd”]

=>第一个列表开头的一个
'a'
将丢失


我希望有人能帮我解决这个错误。非常感谢您

当您第一次(从组中)调用groupHelper时,您正在传递prev参数,但helper仅将其用于比较。 解决方案可以是在第一次调用时将第一个项添加为第一个组的第一个元素。 这样地:
group(x:xs)=groupHelper xs x[[x]]

您忘记将第一个元素
x
添加到累加器中,因此可以通过以下方法解决此问题:

group (x:xs) = groupHelper xs x [[x]]

顺便说一句,我找到了问题的解决方案-如果我调用group(x:xs)=groupHelper xs x[[x]],它将返回正确的结果。但是我仍然不明白为什么我在没有这个修改的情况下做了错误的事情,顺便说一句,递归地建立像
f…=f(…)+(…)
对性能非常不利,因为您会在右侧不断追加,每次都需要遍历越来越大的列表。更好的方法是将部分结果放在递归调用的左边。这是我犯的一个相当愚蠢的错误。我现在通过编写group(x:xs)=groupHelper(x:xs)x[]解决了这个问题,因为我认为它比以前的解决方案更干净一点。非常感谢你的帮助!
group :: Eq a => [a] -> [[a]]
group [] = []
group (x:xs) = let (y:ys) = go xs x in (x:y):ys
    where go [] _ = [[]]
          go (a:as) b | a == b = let (c:cs) = go as b in (a:c):cs
                      | otherwise = [] : go (a:as) a