Haskell Hero

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

Maybe

¿Por qué Maybe?

Ejemplo

Definid la función find que toma una lista de tipo Eq a => [a] y un valor de tipo Eq a => a. La expresión find s x debe evaluarse a un número que indica el índice del primero x en la lista s.

find [1,2,3,4,5] 3  ~>*  3
find "qwertz"   't' ~>*  5


Puede parecer que no es nada difícil. Sin embargo, un problema surge cuando el elemento x no aparece en la lista s. Quieremos que la expresión find s x evalúe al índice del primero x en la lista s o a un valor "no encontrado" si x no aparece en la lista s. En estos casos utilizamos el tipo Maybe a.

Quizás devuelva algo, quizás no

EL tipo Maybe a está definido de manera siguiente:

data Maybe a  =  Nothing  |  Just a

La caja Maybe Int contiene por ejemplo valores
Just 5
Just 4
Just (-6)
Nothing
Just 3
Just 0

Podemos entonces definir la función find de manera siguiente:

find     ::  Eq a  =>  [a] -> a -> Maybe Int
find s x  =  find1 s x 1

find1           ::  Eq a  =>  [a] -> a -> Int -> Maybe Int
find1 []    _ _  =  Nothing
find1 (y:s) x n  =  if y == x then n
                              else find1 s x (n+1)

La función find1 es una función auxiliar. La hemos definido porque necesitamos guardar la información sobre el número de elementos que ya hemos examinado cuando recorriendo la lista. Esta información se encuentra en el tercer parámetro.