Warum wird diese Funktion in Haskell nicht beendet?

8

Ich bin verwirrt, warum meine Funktion, nestdie fmit sich selbst komponiert , nmal ist

nest f 0 = id
nest f n = f . nest f (n - 1)

endet nie. Ich hätte gedacht, dass es "Musterübereinstimmung" für den Fall geben würde, wenn nNull wird. Ich definiere es, indem ich diese beiden Zeilen in GHCI eingebe und nest (+ 1) 2 3zum Beispiel mit anrufe .

Jon Deaton
quelle
4
Wir brauchen mehr. Wie definieren und laden Sie diese Funktion? Wie rufen Sie diese Funktion auf? Wenn ich es als Datei speichere, lade es mit GHCi 8.6.4 und rufe es auf, wenn nest (+1) 3 2es mit endet 5.
Thomas M. DuBuisson
1
Oh, interessant. Ich habe in GHCI eingefügt und es genau wie Sie angerufen nest (+1) 3 2.
Jon Deaton

Antworten:

12

Indem Sie die Funktion in zwei separate REPL-Zeilen eingeben, definieren Sie sie beim zweiten Mal im Wesentlichen neu, wobei der Basisfall weggelassen wird.

Der richtige Weg, um diese Funktion in die REPL einzugeben, ist:

nest f 0 = id; nest f n = f . nest f (n - 1)

Alternativ können Sie mit dem :{Befehl in den mehrzeiligen Modus wechseln und ihn mit verlassen :}.

Emily
quelle
6

Als Sie es in GHCi eingefügt haben, haben Sie eine Funktion von definiert nest f 0 = id. Dann sagten Sie: "Ignorieren Sie diese Funktion, ich ersetze sie durch eine neue Funktion mit demselben Namen, in der sich die gesamte Definition befindet nest f n = f . nest f (n - 1).

Thomas M. DuBuisson
quelle