Python Slices in Haskell

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Zuletzt geändert von hendrikS am Montag 10. Mai 2010, 17:05, insgesamt 3-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ohne negative Indizes ist es aber irgendwie langweilig ;-)

(es heißt übrigens äquivalent)

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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. :(
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Also bei mir kommt auch [1, 6] raus. Ich hatte noch einen dummen Fehler entfernt, vielleicht hast du die alte Version abbekommen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Antworten