Warum bewertet diese Haskell-Anweisung nicht träge?

8

Ich habe die folgende Funktion definiert:

%Vor%

Dann, wenn ich Folgendes ausführe:

%Vor%

es versucht, die Summe der unendlichen Folge zu berechnen, anstatt faul und zurück zu sein 1. Warum?

BEARBEITEN: Bei weiterer Untersuchung stellte ich fest, dass Faulheit passiert, wenn ich die Funktion ex in einer Datei definiere, aber nicht, wenn ich sie in GHCI definiere:

%Vor%

Wenn ich die ex Definition in eine Datei (in diesem Fall test.hs) ziehe:

%Vor%

Die neue Frage ist also warum?

    
perimosocordiae 08.07.2010, 17:43
quelle

3 Antworten

17

In GHCi führt jede let -Anweisung eine neue Definition von ex ein, anstatt wie erwartet mehrere Musterfälle. Es hängt also, weil, wenn Sie ex 1 (sum [1..]) hinterher eingeben, nur die letzte ex b x = b ** x Version existiert.

Wenn Sie eine Funktion mit mehreren Musterfällen in GHCi definieren möchten, müssen Sie sie in eine einzige let -Anweisung setzen, etwa so:

%Vor%

Das gleiche gilt für alles andere, das normalerweise über mehrere Zeilen hinweg geschrieben wird, wie z. B. do notation. Zum Beispiel eine Funktion wie folgt:

%Vor%

Müsste so in GHCi geschrieben werden:

%Vor%     
C. A. McCann 08.07.2010, 17:55
quelle
1
%Vor%

Sie definieren hier keine Funktion mit zwei Fällen. Sie definieren eine Funktion mit einem Fall und definieren sie dann erneut, indem Sie die vorherige Definition überschreiben.

Um eine Funktion mit zwei Mustern zu definieren, verwenden Sie let ex 1 x = 1; ex b x = b ** x , d. h. trennen Sie die Fälle mit einem Semikolon.

    
sepp2k 08.07.2010 17:57
quelle
-2

Ich habe einen Punkt der Faulheit übersehen, was die Antwort unter false macht.

Weil sum die Gesamtsumme aller Elemente in der Sequenz berechnet. Was in deinem Fall endlos ist.

Sie möchten wahrscheinlich

%Vor%

Das ist

%Vor%     
Dykam 08.07.2010 17:52
quelle

Tags und Links