www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Landei

Gepostet:
07.06.2011 15:19

Liste in Teillisten gegebener Länge splitten  

Ich möchte eine Funktion, die eine Liste in Teillisten gegebener Länge splittet, z.B. splitN 3 [1,2,3,4,5,6,7] --> [[1,2,3],[4,5,6],[7]]

Gibt es eine bessere Lösung als dieses Monster?


splitN n list = reverse . fst $ until (null.snd) (\\(x,y) -> ((take n y):x, drop n y)) ([],list)
Zum Seitenanfang    
 
deinTutor

Gepostet:
08.06.2011 14:31

   

evtl so:

splitN _ [] = []
splitN n xs = [take n xs] ++ splitN n (drop n xs)
Zum Seitenanfang    
 
Landei

Gepostet:
08.06.2011 15:55

   
Ja, das scheint die bessere Lösung zu sein.

Es wundert mich trotzdem, dass es keine Higher-Order-Funktion gibt, die dieses Muster so richtig abbildet. Dann brauchte man sowas wie consume:


splitN n xss = consume (\\xs -> (take n xs, drop n xs)) xss

consume f [] = []
consume f xss = let (x,xs) = f xss in x : consume f xs


Für\'s Poesiealbum noch die Version mit Arrows:


import Control.Arrow

splitN n = take n &&& drop n >>> second (\\xs -> if null xs then [] else splitN n xs) >>> uncurry (:)


Das hat bestimmt Potential, aber ganz offensichtlich fehlt mir da noch einiges Arrow-Fu.
Zum Seitenanfang