Em linguagens ansiosas como Scheme e Python, você pode usar uma expressão lambda sem parâmetros para atrasar a avaliação, por exemplo, em Scheme (Chicken Scheme):
#;1> (define (make-thunk x) (lambda () (+ x 1)))
#;2> (define t (make-thunk 1))
#;3> (t)
2
Na linha 2, t
é vinculado à expressão não avaliada (lambda () (+ 1 1))
, que é avaliada 2
na linha 3.
Da mesma forma, em Python:
>>> def make_thunk(x): return lambda: x + 1
...
>>> t = make_thunk(1)
>>> t()
2
Usando essa técnica, é possível implementar uma avaliação lenta em um idioma ansioso.
Então, eu esperava que Haskell não tivesse expressões lambda sem parâmetros, porque a linguagem já é preguiçosa e não há necessidade de criar expressões atrasadas. Para minha surpresa, descobri que em Haskell é possível escrever a expressão lambda
\() -> "s"
que só pode ser aplicado ao ()
valor da seguinte forma:
(\() -> "s") ()
dando o resultado
"s"
A aplicação desta função a qualquer argumento que não seja ()
lança uma exceção (pelo menos até onde pude ver durante meus testes). Isso parece diferente da avaliação atrasada em Scheme e Python, porque a expressão ainda precisa de um argumento para ser avaliado. Então, o que uma expressão lambda sem variáveis (como \() -> "s"
) significa em Haskell e para que ela pode ser útil?
Além disso, eu ficaria curioso para saber se existem expressões lambda sem parâmetros semelhantes em (alguma variedade de) cálculo lambda.
()
gera uma exceção ..." Faz com que o programa lance uma exceção ou faz com que o compilador reclame que o código não digita check?