Kann mir jemand erklären, warum das gleich 5 ist?Warum (x = x + 3 in fst (snd (x + 1, (5, x-2)))) gleich 5
let x = x+3 in fst (snd (x+1,(5,x-2)))
Kann mir jemand erklären, warum das gleich 5 ist?Warum (x = x + 3 in fst (snd (x + 1, (5, x-2)))) gleich 5
let x = x+3 in fst (snd (x+1,(5,x-2)))
snd(x+1,(5,x-2))
gleich zu (5,x-2)
, dann fst(5,x-2)
zu 5
entspricht. All dies erfordert keine Auswertung von Ausdruck, der x
enthält (Haskell ist faul, bedeutet, dass es Dinge nur bei Bedarf bewertet).
Lassen Sie uns das jetzt let x = x + 3 in
Teil ignorieren und auf das konzentrieren, was nach dem in
kommt:
fst (snd (x + 1, (5, x - 2)))
Mit den Definitionen von fst
und snd
fst (a, b) = a
snd (a, b) = b
So wird reduziert, was
in den Klammern erste istsnd (x + 1, (5, x - 2)) ==> (5, x - 2)
Nun wird diese zu fst
geben:
fst (5, x - 2) ==> 5
Also am Ende der Wert x
nicht wirklich wichtig sind.
Dies kann in Haskell wegen etwas, das als faule Auswertung bezeichnet wird, auftreten. Im Wesentlichen wird der Compiler einen Wert nicht auflösen, bis er benötigt wird. Mit der Definition
x = x + 3
Wenn Sie versucht x
drucken Sie würde eine Endlosschleife bekommen und wahrscheinlich einen Fehler an einem gewissen Punkt, wenn Sie über genügend Arbeitsspeicher ausgeführt versucht, dies zu bewerten. Da der Wert x
nie wirklich ausgedruckt wird, kann der Compiler seinen Wert nicht auflösen. Der Wert, der beim Auswerten des Ausdrucks in der REPL-Datei an die Konsole ausgegeben wird, ist 5 und hat keine Abhängigkeiten vom Wert x
. Daher kann x
ignoriert werden.
Ein weiteres Beispiel, wo faul Programmierung kommt, ist zum Spielen der Ausdruck
> let ones = 1:ones in take 5 ones
[1,1,1,1,1]
Die Definition let ones = 1:ones
eine unendliche Liste von 1s definiert, aber da wir 5 von ihnen nur mit take 5 ones
greifen, dieser Ausdruck in der Lage, Entschlossenheit.
Was denken Sie, dass es gleich sein sollte, und warum? –
Sie können es Schritt für Schritt berechnen, beginnen durch Ersetzen von 'snd (a, b)' mit 'b' ... – chi
Fragen Sie, warum es nicht gleich was anderes ist oder warum es keinen Fehler erzeugt? – sepp2k