Lazy-Evaluierung in Haskell, wenn die Argumente mehrmals vorkommen

8

Nehmen wir an, ich habe eine Funktion, die die Potenz von vier einer durch

definierten Zahl berechnen kann %Vor%

Und ich versuche, x = (3 + 8) * 2

zu übergeben %Vor%

Da in Haskell die Werte ausgewertet werden, bis sie benötigt werden, bedeutet das, dass x vier Mal auswertet? Wenn ja, gibt es eine Möglichkeit, den Haskell-Compiler zu verbessern?

Danke.

    
DB Tsai 11.10.2011, 04:42
quelle

2 Antworten

9

Wenn Sie sich nicht sicher sind, können Sie trace verwenden, um nachzusehen (ref: Ссылка ):

%Vor%

Ergebnis:

%Vor%

so wird der Ausdruck nur einmal ausgewertet.

    
kennytm 11.10.2011, 05:00
quelle
10

Nein, es wird nur einmal ausgewertet. In call by name würde es vier Mal ausgewertet, aber alle Haskell-Implementierungen sind call by need (obwohl der Standard dies nicht erfordert), was bedeutet, dass jeder Ausdruck ausgewertet wird höchstens einmal.

Dies gilt nur, wenn der Ausdruck vollständig konkret ist. Z.B. Es gibt keine Garantie, dass in:

%Vor%

Bei der Berechnung von bar wird (1+2) nur einmal ausgewertet. Tatsächlich wird es wahrscheinlich zweimal ausgewertet (wenn ohne Optimierungen kompiliert).

    
luqui 11.10.2011 05:01
quelle

Tags und Links