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)

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top