In eifrigen Sprachen wie Scheme und Python können Sie einen Lambda-Ausdruck ohne Parameter verwenden, um die Auswertung zu verzögern, z. B. in Scheme (Chicken Scheme):
#;1> (define (make-thunk x) (lambda () (+ x 1)))
#;2> (define t (make-thunk 1))
#;3> (t)
2
In Zeile 2 t
wird an den nicht bewerteten Ausdruck gebunden, der (lambda () (+ 1 1))
dann 2
in Zeile 3 ausgewertet wird .
Ähnlich in Python:
>>> def make_thunk(x): return lambda: x + 1
...
>>> t = make_thunk(1)
>>> t()
2
Mit dieser Technik kann man eine verzögerte Auswertung in einer eifrigen Sprache implementieren.
Ich hatte also erwartet, dass Haskell keine Lambda-Ausdrücke ohne Parameter haben würde, da die Sprache bereits faul ist und keine verzögerten Ausdrücke erstellt werden müssen. Zu meiner Überraschung fand ich heraus, dass es in Haskell möglich ist, den Lambda-Ausdruck zu schreiben
\() -> "s"
was nur auf den ()
Wert wie folgt angewendet werden kann :
(\() -> "s") ()
das Ergebnis geben
"s"
Das Anwenden dieser Funktion auf ein anderes Argument als das ()
Auslösen einer Ausnahme (zumindest soweit ich dies während meiner Tests sehen konnte). Dies scheint sich von der verzögerten Auswertung in Scheme und Python zu unterscheiden, da der Ausdruck noch ein zu bewertendes Argument benötigt. Was bedeutet ein Lambda-Ausdruck ohne Variablen (wie \() -> "s"
) in Haskell und wofür kann er nützlich sein?
Ich wäre auch neugierig zu wissen, ob ähnliche parameterlose Lambda-Ausdrücke in (einer Vielzahl von) Lambda-Berechnungen existieren.
()
Auslösen einer Ausnahme ..." Verursacht das Programm eine Ausnahme oder beschwert sich der Compiler darüber, dass der Code keine Prüfung eingibt?