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
> True || False
True
> True && False
False
Para saber si el 6 es par y divisible por 3:
> even 6 && (esDivisible 6 3)
True
En Haskell,
> not true
``Not in scope: `true'``
> not "true"
`` Couldn't match expected type `Bool' ``
`` with actual type `[Char]' ``
> not True
False
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!