Ich brauche etwas Klärung über Faulheit mit Haskell.Inwiefern ist Haskell faul?
Wenn ich diese Funktion:
myFunction arg
| arg == 1 = a
| arg == 2 = a*b
| arg == 3 = b+c
| otherwise = (a+b)*c
where
a = ...
b = ...
c = ...
d = ...
Als ich myFunction 1
nennen, werden Haskell bewerten nur die a = ...
Funktion, weder b noch c noch d.
Aber wenn ich schreibe
myFunction arg
| arg == 1 = a
| arg == 2 = a*b
| arg == 3 = b+c
| otherwise = (a+b)*c
where
(a,b,c,d) = anotherFunction arg
Was wird Haskell Verhalten sein?
- Wird es nur eine und 'propagieren' die lazyness zu
anotherFunction
bewerten? - Oder wird es das ganze Tupel (a, b, c, d) als Ergebnis von
anotherFunction
auswerten?
Es wird das Tupel 'x = anotherFunction arg' ausgewertet, aber nicht alle _elements_ des Tupels. – Zeta
Wenn Sie "call' myFunction 1 "sagen, nehme ich an, Sie meinen, wenn dieser Ausdruck ausgewertet wird. Wie Zeta sagt, wird es das Tupel (aber nicht die Elemente) auswerten und dann "a" aus diesem Tupel auswerten. – augustss
@Zeta Ist es richtig zu sagen, dass die anderen Werte der Tupel "b", "c" und "d" in Thunkform sind. Oder gibt es dafür ein passenderes Wort? – Sibi