2017-09-01 131 views
-3

我想从[1,26,3,94,51,6,7,8,9,10,11,12,73,29,19,90,76,87,1]列表中的分组元素在Haskell

转换列表,以[[1],[26,3],[94,51,6],[7,8,9,10],[11,12,73,29,19]]并以此类推,直到在Haskell结束。 (我想组的元素在增加子列表的长度为序)

我是新来的Haskell请帮我

+4

什么是分组标准?为什么'[26,3]'分组在一起?你有什么尝试?你卡在哪里? –

回答

1

您可以接收一个列表,并返回一个列表你自己的递归函数首先我们需要take列表中的n个元素,因为我们称之为take n xs,之后我们需要将元素与其余元素一起使用,因此我们需要调用mySplit n+1并删除列表中的元素,所以我们只需要call drop n xsdrop

mySplit :: Int -> [a] -> [[a]] 
mySplit n [] = [] 
mySplit n xs = (take n xs):(mySplit (n + 1) (drop n xs)) 

ghci> mySplit 1 [1,26,3,94,51,6,7,8,9,10,11,12,73,29,19,90,76,87,1] 
[[1],[26,3],[94,51,6],[7,8,9,10],[11,12,73,29,19],[90,76,87,1]] 
+0

谢谢。有没有内置功能可以做到这一点? – VVV

+0

是的,您可以使用带有拉姆达的折叠器。 – Gober

+1

['splitAt'](http://hackage.haskell.org/package/base-4.10.0.0/docs/Prelude.html#v:splitAt)会让这段代码更有效率,所以你不会必须用'take'和'drop'两次迭代列表。 – 4castle