Estou trabalhando com "A Implementação de Linguagens de Programação Funcional", de Simon Peyton Jones, e na página 20 eu vejo:
SE VERDADEIRO ((λp.p) 3) ↔ SE VERDADEIRO 3 (por β vermelho) (1) ↔ (λx.IF VERDADEIRO 3 x) (por η vermelho) (2) ↔ (λx.3) (3)
Os passos 1 a 2 são explicados como conversão η. Mas de 2 a 3 diz "O passo final é a regra de redução para o FI". Não sei ao certo qual é essa regra de redução.
IF a b c -> IF a' b c with a-> a'
IF FALSE 3
é equivalente a\x -> IF FALSE 3 x
(supondo que a aplicação parcial deIF
seja permitida).IF FALSE 3
precisa de mais um argumento para ser reduzido a um valor; aplicá-lo aosx
rendimentosIF FALSE 3 x
, o que reduz a simplesmentex
. Portanto,IF FALSE 3
é de fato equivalente a\x -> x
, desde que estejamos usando o cálculo lambda sem tipo; se você tentar fazer isso no Haskell (definindo uma funçãoif' :: Bool -> a -> a
para que possa aplicá-la parcialmente), você obterá aid
função especializada para qualquer tipo que Haskell deduza para o3
.