In linguaggi desiderosi come Scheme e Python, puoi usare un'espressione lambda senza parametri per ritardare la valutazione, ad es. in Scheme (Chicken Scheme):
#;1> (define (make-thunk x) (lambda () (+ x 1)))
#;2> (define t (make-thunk 1))
#;3> (t)
2
Nella riga 2, t
è associato all'espressione non valutata (lambda () (+ 1 1))
, che viene quindi valutata a 2
nella riga 3.
Allo stesso modo, in Python:
>>> def make_thunk(x): return lambda: x + 1
...
>>> t = make_thunk(1)
>>> t()
2
Usando questa tecnica si può implementare una valutazione pigra in un linguaggio appassionato.
Quindi, mi aspettavo che Haskell non avrebbe espressioni lambda senza parametri perché il linguaggio è già pigro e non è necessario creare espressioni ritardate. Con mia sorpresa, ho scoperto che in Haskell è possibile scrivere l'espressione lambda
\() -> "s"
che può essere applicato solo al valore ()
in questo modo:
(\() -> "s") ()
dare il risultato
"s"
Applicando questa funzione a qualsiasi argomento diverso da ()
si genera un'eccezione (almeno per quanto ho potuto vedere durante i miei test). Questo sembra diverso dalla valutazione ritardata in Scheme e Python, perché l'espressione ha ancora bisogno di un argomento da valutare.
Quindi cosa significa un'espressione lambda senza variabili (come \() -> "s"
) in Haskell e cosa può essere utile?
Inoltre, sarei curioso di sapere se espressioni lambda parametriche simili esistono in una varietà di lambda-calculus.