Ich gehe durch die learn you a haskell Tutorial und Ich stolperte über einige der Beispiele, die der Autor gegeben hat.Haskell Pattern Matching: Lesbarkeit und Leistung
Zum Beispiel er reimplementiert zip wie folgt:
zip' :: [a] -> [b] -> [(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys
Er verwendet einen ähnlichen Ansatz für all seine anderen Beispielen , wo er zuerst die meisten spezifischen Mustern setzt. Hier ist eine etwas andere Version der Zip-Funktion:
zip' :: [a] -> [b] -> [(a,b)]
zip' (x:xs) (y:ys) = (x, y):zip' xs ys
zip' _ _ = []
Soweit ich verstehe beiden Methoden das gleiche tun. Wenn eine leere Liste entweder Weg (x: xs) oder (y: ys) wird nicht übereinstimmen, die die Rekursion durch Anhängen die leere Liste [] abgeschlossen wird.
- Ich persönlich bevorzuge die zweite Version für die Lesbarkeit, aber vielleicht liege ich falsch damit.
- Hat es Auswirkungen auf die Leistung einer Methode? Soweit ich weiß, wenn das oberste Muster nicht übereinstimmt, wird Haskell gegen das nächste Muster prüfen. Beeinflusst die Reihenfolge der Muster die Leistung?
Mit freundlichen Grüßen
Edit:
Möglicherweise Duplikat von: Haskell GHC: what is the time complexity of a pattern match with N constructors?
Zusammenfassung: Die Reihenfolge der Muster für die Semantik sehr wichtig ist (im Hinblick auf die strenge Bewertung der Argumente) und die Lesbarkeit einer Funktion. Die Musterübereinstimmung selbst wird immer in O (1) Zeitkomplexität sein.
Mögliches Duplikat von [Haskell GHC: Wie hoch ist die zeitliche Komplexität einer Musterübereinstimmung mit N Konstruktoren?] (Http://stackoverflow.com/questions/9027384/haskell-ghc-what-is-the-time-complexity -of-a-pattern-match-with-n-Konstruktoren) – Nimi