在Haskell中对特定值的连续元素进行分组

Geo*_*dis 0 haskell

我在haskell中有一个数字列表,我想执行以下转换:

  • 当元素不等于1时,只需在新列表中附加此元素即可
  • 当一个元素等于1时,在列表中附加一个包含所有连续1的子列表,然后继续下一个不等于1的字符

为了明确要求我发布了一个例子:

Input: [1,2,3,1,1,1,2,3,4,2,1]

Expected Output: [[1] , 2 , 3 , [1,1,1] , 2 , 3 , 4 , 2 , [1]]
Run Code Online (Sandbox Code Playgroud)

重要提示:不等于1的元素不会添加到子列表中

我找到了一些解决方法来使它工作,但我需要找到一个优雅的解决方案,不会多次遍历列表的元素.

有任何想法吗?

Naz*_*iuk 6

你需要一个功能

>> import Data.List
>> group [1,2,3,1,1,1,2,3,4,2,1]
>> [[1],[2],[3],[1,1,1],[2],[3],[4],[2],[1]]
Run Code Online (Sandbox Code Playgroud)

请注意,每个项目都是一个列表,因为列表中的值应该具有相同的类型.这就是为什么你的例子[[1], 2, ..]在Haskell中是不可能的


如果要形成群体1S,其余那么你可以使用GROUPBY

>> import Data.List
>> groupBy (\a -> \b -> a == b && a == 1 || a /= 1 && b /= 1) [1,2,3,1,1,1,2,3,4,2,1]
>> [[1],[2,3],[1,1,1],[2,3,4,2],[1]]
Run Code Online (Sandbox Code Playgroud)