如何使用take and drop while修复此haskell函数?

如何使用take and drop while修复此haskell函数?,haskell,Haskell,我被要求创建一个haskell函数,该函数将执行以下操作: group [1,1,2,3,3] = [[1,1],[2],[3,3]] group [] = [] 本质上,它将相同的连续项分组 我应该使用take and drop,同时: group [] = [] group (x:xs) = (takeWhile cond xs ++ [x]) : group (dropWhile cond xs) where cond = (\x -> x == head xs)

我被要求创建一个haskell函数,该函数将执行以下操作:

group [1,1,2,3,3] = [[1,1],[2],[3,3]]

group [] = []
本质上,它将相同的连续项分组

我应该使用take and drop,同时:

group [] = []
group (x:xs) = (takeWhile cond xs ++ [x]) : group (dropWhile cond xs)
   where
    cond = (\x -> x == head xs)
这是我的

上述方法适用于单个元素位于末尾的情况:组[1,1,2]=[[1,1],2],但不适用于位于中间的情况:组[1,1,1,2,4]=[[1,1,1],[4,2]]应该是[[1,1,1],[4],[2]]


我在功能上的错误是什么?

简短回答:您的错误是在您的情况下使用head。你想和x比较,而不是头x

在风格上,还要注意

有些东西+++[x]不那么实用和高效,尽管它在这里与x无关:有些东西在这里,与顺序无关, 函数f=\x->something实际上应该写成f x=something, 您可能不应该使用相同的变量名来引用不同的值,这很容易混淆。 使用部分应用的==,可以轻松重写函数cond:


这将产生[1,1,1,2,4]组的预期结果。

简短回答:您的错误是在您的情况下使用head。你想和x比较,而不是头x

在风格上,还要注意

有些东西+++[x]不那么实用和高效,尽管它在这里与x无关:有些东西在这里,与顺序无关, 函数f=\x->something实际上应该写成f x=something, 您可能不应该使用相同的变量名来引用不同的值,这很容易混淆。 使用部分应用的==,可以轻松重写函数cond:


这就产生了组[1,1,1,2,4]的预期结果。

两个不同的变量被命名为x.group[1,1,2]=[[1,1],2]我知道,如果不查看组的源,这是不可能的,因为RHS是病态的。两个不同的变量被命名为x.group[1,1,2]=[[1,1],2]我知道,如果不看群体的来源,这是不可能的,因为RHS类型不正确。你的意思是说不太实用而不是更实用吗?你的意思是说不太实用而不是更实用吗?
group [] = []
group (x:xs) = (x : takeWhile cond xs) : group (dropWhile cond xs)
  where cond = (==) x