2017-09-01 6 views
-3

Ich möchte von [1,26,3,94,51,6,7,8,9,10,11,12,73,29,19,90,76,87,1]Gruppierung Elemente in einer Liste in Haskell

-[[1],[26,3],[94,51,6],[7,8,9,10],[11,12,73,29,19]] und so weiter, bis Ende in Haskell eine Liste zu machen. (Ich bin in zunehmender Reihenfolge der Länge der Unter Liste der Elemente zu einer Gruppe versuchen)

: Ich bin Haskell bitte helfen mir

+4

Was ist das Gruppierungskriterium? Warum sind '[26,3]' zusammen gruppiert? Was hast du probiert? Wo steckst du fest? –

Antwort

1

Sie können Ihre eigene rekursiv Funktion machen, die eine Liste empfängt und gibt eine Liste der Liste, zuerst müssen wir take n Elemente aus der Liste, für die wir rufen take n xs, danach müssen wir das Element mit dem Rest der Elemente für diese müssen wir anrufen mySplit n+1 und lassen Sie das Element, das wir aufgenommen, um zu listen, Wir brauchen also nur 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

Danke. Gibt es eine eingebaute Funktion, um das Gleiche zu tun? – VVV

+0

Ja, Sie können einen Folder mit einem Lambda verwenden. – Gober

+1

['splitAt'] (http://hackage.haskell.org/package/base-4.10.0.0/docs/Prelude.html#v:splitAt) würde diesen Code ein wenig effizienter machen, so dass Sie das nicht tun muss die Liste zweimal mit 'take' und' drop' durchlaufen. – 4castle