Haskell Hero

Haskell Hero es un manual interactivo del lenguaje Haskell para principiantes.

Funciones con booleanos

¿Por qué funciones con valores booleanos?

Ejemplo

Definid la función parGrande :: Integer -> Char donde la expresión parGrande x se evalua al carácter 'A' si x es par y al mismo tiempo superior a 10 y al carácter 'N' en caso contrario.


Una solución podría ser la siguiente:

  • Comprueba si x es par.
    • Si x es par, comprueba si x es superior a 10.
      • Si es superior a 10, evalúa la expresión 'A'.
      • Si no, evalúa la expresión a 'N'.
    • Si x no es par, evalúa la expresión a 'N'.

Escrito en Haskell:

parGrande   ::  Integer -> Char
parGrande x  =  if even x then if x > 10 then 'A'
                                         else 'N'
                          else 'N'
No es necesario destacar que si las condiciones fueran tres o cuatro y querríamos que todas se cumplirán, el código sería muy desordenado. Por eso tenemos funciones con booleanos.

Y lógico

Y lógico, es decir la conjunción lógica, es una función binaria que se representa con el operador (&&). Como parámetros toma dos valores de tipo Bool. La expresión x && y se evalúa a True si tanto x como y se evalúan a True.

Definición

(&&)         ::  Bool -> Bool -> Bool
True && True  =  True
_    && _     =  False
Esta definición supone que ya sabemos que es la evaluación de los dos parámetros. Sin embargo, si el primer parámetro se evalúa a False, no hay que evaluar el segundo parámetro porque la evaluación final será False de todos modos.

Al contrario, si el primer parámetro se evalúa a True, toda la expresión se evalúa al resultado de la evaluación del segundo parámetro.

Por eso se usa la definición siguiente:

False && _  =  False
True  && x  =  x

Ejemplo

Definamos la función del ejemplo del primer párrafo. Su definición con (&&) podría ser la siguiente:

parGrande x  =  if  even x  &&  x > 10  then 'A'
                                        else 'N'

O lógico

La función o lógico, es decir la disyunción lógica, la usamos cuando queremos usar una condición compuesta que debe evaluarse a True si al menos una condición interior se evalúa a True. La escribimos con el operador (||).

Definición

False || False  =  False
_     || _      =  True
Igualmente como la función (&&), la función (||) también tiene una variante más efectiva. Si el primer parámetro se evalúa a True, no hay que evaluar el segundo parámetro ya que sabemos que toda la expresión se evalúa a True.
True  || _  =  True
False || x  =  x

Ejemplo

Definid una función entre :: Integer -> String donde la expresión entre x se evalúa a "Sí" si x es un número entero fuera de valores desde 10 hasta 20 y a "No" en caso contrario.


Definimos entonces una función que comprueba si el número es inferior a 10 o superior a 20.

entre   ::  Integer -> String
entre x  =  if  x < 10  ||  x > 20  then  "Sí"
                                    else  "No"

Not

La función unaria not hace la negación lógica.

Definición

not       ::  Bool -> Bool
not True   =  False
not False  =  True