2010-09-22 9 views
8
iterate :: (a -> a) -> a -> [a] 

(Wie Sie wahrscheinlich wissen) iterate ist eine Funktion, die eine Funktion und Startwert übernimmt. Dann wendet es die Funktion auf den Startwert an, wendet dann die gleiche Funktion auf das letzte Ergebnis an und so weiter.Wie würden Sie Iterate in Haskell (neu) implementieren?

Prelude> take 5 $ iterate (^2) 2 
[2,4,16,256,65536] 
Prelude> 

Das Ergebnis ist eine unendliche Liste. (deshalb verwende ich take). Meine Frage, wie würden Sie Ihre eigene iterate' Funktion in Haskell implementieren, nur mit den Grundlagen ((:)(++) Lambda, Pattern Mataching, Wachen, etc.)?

(Haskell Anfänger hier)

Antwort

22

Nun, Iterierte eine unendliche Liste von Werten ein von f erhöht konstruiert. Also ich würde zunächst eine Funktion zu schreiben, die einen gewissen Wert ein zur Liste von rekursiv Aufruf Iterierte mit fa konstruiert vorangestellt:

iterate :: (a -> a) -> a -> [a] 
iterate f a = a : iterate f (f a) 

Dank lazy evaluation, nur der Teil der aufgebauten Liste notwendig zu berechnen Der Wert meiner Funktion wird ausgewertet.

+0

Vielen Dank für Ihr Feedback. –

+0

Das sieht aus wie eine Variation der "fix" -Definition "fix f = f (fix f)" ähnlich wie ... "iterate f (fa)" könnte man fix verwenden, um iterate zu definieren: "iterate fa = fix (\ rx -> x: r (fx)) ein "nicht dass es besser ist, dachte ID sagen :) – QuantumKarl

12

Beachten Sie auch, dass Sie in dem Report Standard Prelude kurze Definitionen für den Bereich der grundlegenden Haskell-Funktionen finden können.

Das Lesen dieser Liste von einfachen Definitionen, die im Wesentlichen eine umfangreiche Bibliothek aus rohen Primitiven bootstrappt, kann sehr lehrreich und augenöffnend in Bezug auf die Bereitstellung eines Fensters auf den "Haskell-Weg" sein.

Ich erinnere mich an einen sehr frühen aha Moment beim Lesen: data Bool = False | True.

+0

Nice link! Sehr lehrreich! –

Verwandte Themen