Este artículo explica un truco de programación en Haskell que permite escribir expresiones if cuyos tipos de retorno varían según el valor de la condición, algo que a primera vista parecería exigir tipos dependientes, pero que en realidad solo necesita la extensión RebindableSyntax.
El autor parte de los booleanos codificados al estilo Church, una técnica que representa los valores true y false como funciones que reciben dos argumentos y devuelven uno de ellos, comportándose como un if preformado. Con la extensión RankNTypes se consigue que if/then/else se desazucare a una función ifThenElse basada en esos booleanos, y se demuestra cómo implementar también las operaciones not, && y ||.
El giro está en eliminar todas las anotaciones de tipo y la extensión RankNTypes, dejando únicamente RebindableSyntax. Al hacerlo, el compilador infiere tipos más generales: true pasa a ser a -> b -> a y false, a -> b -> b, de modo que cada rama puede devolver un tipo distinto. Así, una función como example bool = if bool then 5 else "hi!" compila sin errores y devuelve 5 cuando la condición es verdadera y la cadena "hi!" cuando es falsa. El truco funciona también con operaciones booleanas compuestas, como false && true o not true.
En resumen, se trata de una muestra de cómo la inferencia Hindley-Milner, combinada con la codificación Church y una sola extensión de GHC, basta para emular un comportamiento propio de lenguajes con tipos dependientes, sin necesidad de recurrir a ellos.
