Wie würden Sie (wieder) implementieren Iterierte in Haskell?
-
04-10-2019 - |
Frage
iterate :: (a -> a) -> a -> [a]
(Wie Sie wahrscheinlich wissen) iterate
ist eine Funktion, die eine Funktion und Startwert nimmt. Dann gilt es, die Funktion auf den Wert Start, dann gilt die gleiche Funktion auf das letzte Ergebnis, und so weiter.
Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude>
Das Ergebnis ist eine unendliche Liste. (Das ist, warum ich take
verwenden).
Meine Frage, wie würden Sie Ihre eigene iterate'
Funktion in Haskell implementieren, indem nur die Grundlagen ((:)
(++)
lambdas, Muster mataching, Wachen, etc.)?
(Haskell Anfänger hier)
Lösung
Nun, iterate baut eine unendliche Liste von Werten a erhöht von f . So würde ich durch das Schreiben einer Funktion starten, die einen gewissen Wert vorangestellt a auf die rekursiv konstruiert Liste von Iterierte Aufruf mit f a :
iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)
Dank lazy evaluation, nur der Teil der aufgebauten Liste notwendig, den Wert meiner Funktion zu berechnen ausgewertet.
Andere Tipps
Beachten Sie auch, dass Sie kurze Definitionen für den Bereich der Grund Haskell Funktionen im Bericht der finden Standard Prelude .
Beim Lesen durch diese Liste von einfachen Definitionen, die im Wesentlichen eine umfangreiche Bibliothek Bootstrap aus roher Primitive kann sehr lehrreich sein und die Augen geöffnet in Bezug auf ein Fenster auf die „Haskell Art und Weise“ bereitstellt.
Ich erinnere mich an ein sehr frühen Aha-Erlebnis beim Lesen. data Bool = False | True