2017-05-04 5 views
1

Ich bin neu in der funktionalen Programmierung und möchte herausfinden, wie faul Bewertung funktioniert. Ich habe folgende Funktionen:Wie funktioniert die faule Evaluation?

nats = 0:(map (+1) nats) 
test = foldr (\x y-> if x > 2 then 0 else x+y) 10 nats 

Und soweit ich das beurteilen kann, der erste bekommt man die Liste aller natürlichen Zahlen, bis sie aus dem Speicher läuft (aber das nie wirklich passiert, dass ich verstehe) und der zweite soll genau was machen? Test hat innerhalb einer Lambda-Kalkülfunktion, die ein x und y erhält und 2 zurückgibt, wenn x> 2 und x + y else, aber soll das bedeuten, dass es 0 zurückgibt, weil x = 10? Ich bin ein wenig verwirrt. In diesem Fall ist wirklich Nats aufgerufen?

EDIT: Test gibt 3 zurück, aber jetzt bin ich wirklich verwirrt, weil ich nicht verstehe, wie.

Danke und Entschuldigung, wenn ich einen Anfängerfehler mache, aber ich verstehe nicht, wie das funktioniert.

+2

Sie es einfach nach hinten haben: 'X' über die Elemente von 'reicht nats', die verwendet wird, und' 10' wird nur verwendet, wenn das Ende der 'nats' ist erfüllt - was bedeutet, dass' 10' niemals benutzt wird. Der 'foldr' berechnet' 0+ (1+ (2+ (0)) 'wo die letzte 0 wegen' x = 3> 2' ist, was das 'if' return 0. – chi

Antwort

5

Vielleicht diese Reduzierungen helfen Ihnen:

let x `op` y = if x > 2 then 0 else x + y 

test          => 
foldr op 10 [0..]       => 
0 `op` foldr op 10 [1..]     => 
0 + foldr op 10 [1..]      => 
0 + (1 `op` foldr op 10 [2..])    => 
0 + (1 + foldr op 10 [2..])    => 
0 + (1 + (2 `op` foldr op 10 [3..]))  => 
0 + (1 + (2 + foldr op 10 [3..]))   => 
0 + (1 + (2 + (3 `op` foldr op 10 [4..]))) => 
0 + (1 + (2 + 0))       => 
0 + (1 + 2)        => 
0 + 3          => 
3 
+0

Danke, das hat es ziemlich deutlich gemacht für mich. –