2017-09-01 135 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