Seite 1 von 1

Python Slices in Haskell

Verfasst: Montag 18. Januar 2010, 23:14
von hendrikS
Für diejenigen, die Python und Haskell mögen ist der folgende Haskell Schnipsel vielleicht hilfreich. Ein Versuch die Python Slice Notation nachzubauen.

Code: Alles auswählen

slice :: [a] -> Int -> Int -> Int -> [a]
slice x start end step = _slice (drop start (take end x)) [] step
    where
    _slice :: [a] -> [a] -> Int -> [a]
    _slice     [] ret step = ret
    _slice (x:xs) ret step =
            let  x' = drop (step-1) xs
            in _slice x' (ret ++ [x]) step

main :: IO()
main = print $ slice [0,1,2,3,4,5,6,7,8,9] 1 8 5
[/size]
Die main Funktion ist äquivalent zu diesem Python Schnipsel:

Code: Alles auswählen

print [0,1,2,3,4,5,6,7,8,9][1:8:5]
[/size]
Alternativ/Verbesserungsvorschläge willkommen.

Seit neuer Forumsoftware jetzt auch mit Syntaxhighlighting für Haskell.

Verfasst: Dienstag 19. Januar 2010, 00:00
von EyDu
Hallo.

Ohne negative Indizes ist es aber irgendwie langweilig ;-)

(es heißt übrigens äquivalent)

Sebastian

Verfasst: Dienstag 19. Januar 2010, 00:10
von hendrikS
EyDu hat geschrieben: Ohne negative Indizes ist es aber irgendwie langweilig ;-)
Stimmt!! Das Minus habe ich glatt vergessen. :( Mal sehen, ob ich das noch hinbekomme.
EyDu hat geschrieben: (es heißt übrigens äquivalent)
Ebenso korrekt. :(

Verfasst: Dienstag 19. Januar 2010, 00:31
von EyDu
Ich habe deinen Code noch einmal etwas gekürzt:

Code: Alles auswählen

slice a b c d = [x | (x, i) <- zip a [0,1..], b<=i, i<c, (i-b) `mod` d==0]
Das geht sicher noch kürzer, aber ich habe zu lange nichts mehr in Haskell geschreiben.

Verfasst: Dienstag 19. Januar 2010, 00:48
von hendrikS
EyDu hat geschrieben:Ich habe deinen Code noch einmal etwas gekürzt:
Ist aber noch irgendwie buggig. Bei meinem Beispiel kommt [1,6] raus. Bei Dir [4].
Eine LC hatte ich auch mal probiert. Habs aber irgendwie nicht hinbekommen.

Verfasst: Dienstag 19. Januar 2010, 01:08
von EyDu
Also bei mir kommt auch [1, 6] raus. Ich hatte noch einen dummen Fehler entfernt, vielleicht hast du die alte Version abbekommen.

Verfasst: Dienstag 19. Januar 2010, 09:07
von hendrikS
EyDu hat geschrieben:Also bei mir kommt auch [1, 6] raus. Ich hatte noch einen dummen Fehler entfernt, vielleicht hast du die alte Version abbekommen.
Ja, so war's. Bekomme jetzt auch [1,6] bei Deiner LC.