Manejo de booleanos en haskell

El Tipo Bool

Los booleanos son datos que representan la condición de verdad o falsedad.

Recordemos que even es una función que recibe un número, y devuelve un booleano. (True si el número es par)

Hagamos estas consultas en la consola (El simbolito > al inicio de la línea indica que se está haciendo una consulta):

> even 6 
True
> not True
False
> not False
True

Aquí se ve que not es una función recibe un Bool (y que devuelve el booleano opuesto).

Hay otras funciones que devuelven booleanos:

> 5 < 1
True
> "mama" == "papa"
False

Entonces, si queremos que una función devuelva un booleano, basta con devolver el mismo resultado que obtuvimos. Por ejemplo,

--"la golondrina pepita está empachada si su energía es mayor que 100"
estaEmpachada energia = energia > 100

Conjunción y Disjunción Lógica

> True || False
True
> True && False
False

Para saber si el 6 es par y divisible por 3:

> even 6 && (esDivisible 6 3)
True

Errores Comunes

“true” vs true vs True

En Haskell,

> not true
``Not in scope: `true'``
> not "true"
`` Couldn't match expected type `Bool' ``
`` with actual type `[Char]' ``
> not True
False

Problemas con Booleanos y Guardas

Mal Uso de Booleanos (algo == True, etc.)

Una variante de los problemas con Guardas es lo siguiente:

desaprueba nota = estaAprobada nota == False
pierdePromocion nota = estaAprobada nota == True && nota < 8

Ese código está mal. ¿Por qué? Porque estaAprobada ya devuelve un Booleano. De la misma manera la función menor también devuelve un Booleano. Entonces, en el caso de pierdePromocion, está demás la comparación por True. Y en el caso del desaprobada, si lo que necesito es el opuesto del booleano, entonces debo usar la función not:

desaprueba nota = not (estaAprobada nota)
pierdePromocion nota = estaAprobada nota && nota < 8

Ese código es el correcto. Comprobamos así que funcionan igual:

> estaAprobada 7 == True
True
> estaAprobada 7
True
> estaAprobada 3 == False
True
> not (estaAprobada 3)
True

Además, algo muy importante, es más expresivo usar el not, ya que se lee: “desaprueba una nota cuando no está aprobada” desaprueba nota = not (estaAprobada nota) .

Y por último, estoy ocultando un poquito el cómo . Es decir, nos concentramos en la idea de “negación”, más que en comparar booleanos por ==True o ==False. Como dice Fidel, un profe de la Universidad Nacional de Quilmes: ¡No le tengamos miedo al booleano!