我在haskell中有一个数字列表,我想执行以下转换:
为了明确要求我发布了一个例子:
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的元素不会添加到子列表中
我找到了一些解决方法来使它工作,但我需要找到一个优雅的解决方案,不会多次遍历列表的元素.
有任何想法吗?
你需要一个组功能
>> 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)