En lenguajes ansiosos como Scheme y Python, puede usar una expresión lambda sin parámetros para retrasar la evaluación, por ejemplo, en Scheme (Chicken Scheme):
#;1> (define (make-thunk x) (lambda () (+ x 1)))
#;2> (define t (make-thunk 1))
#;3> (t)
2
En la línea 2, t
está vinculada a la expresión no evaluada (lambda () (+ 1 1))
, que luego se evalúa 2
en la línea 3.
Del mismo modo, en Python:
>>> def make_thunk(x): return lambda: x + 1
...
>>> t = make_thunk(1)
>>> t()
2
Usando esta técnica, se puede implementar una evaluación perezosa en un lenguaje entusiasta.
Entonces, esperaba que Haskell no tuviera expresiones lambda sin parámetros porque el lenguaje ya es vago y no hay necesidad de construir expresiones retrasadas. Para mi sorpresa, descubrí que en Haskell es posible escribir la expresión lambda
\() -> "s"
que solo se puede aplicar al ()
valor de la siguiente manera:
(\() -> "s") ()
dando el resultado
"s"
La aplicación de esta función a cualquier argumento que no sea ()
arroja una excepción (al menos por lo que pude ver durante mis pruebas). Esto parece diferente de la evaluación retrasada en Scheme y Python, porque la expresión todavía necesita un argumento para ser evaluado. Entonces, ¿qué significa una expresión lambda sin variables (como \() -> "s"
) en Haskell y para qué puede ser útil?
Además, me gustaría saber si existen expresiones lambda sin parámetros similares en (alguna variedad de) cálculo lambda.
()
arrojar una excepción ..." ¿Hace que el programa arroje una excepción o el compilador se queja de que el código no escribe check?