2017-03-02 8 views
-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))) 
+5

Was denken Sie, dass es gleich sein sollte, und warum? –

+0

Sie können es Schritt für Schritt berechnen, beginnen durch Ersetzen von 'snd (a, b)' mit 'b' ... – chi

+0

Fragen Sie, warum es nicht gleich was anderes ist oder warum es keinen Fehler erzeugt? – sepp2k

Antwort

3

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).

7

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 ist
snd (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.

Verwandte Themen