Haskell Hero

Interaktivní učebnice pro začínající Haskellisty

Maybe

Proč Maybe?

Příklad

Definujte funkci find, které dáme seznam typu Eq a => [a] a hodnotu typu Eq a => a. Výraz find s x se má vyhodnotit na číslo označující index prvního výskytu prvku x v seznamu s.

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


Může se zdát, že to přece nemůže být nic těžkého. Problém přichází v případě, že prvek x se v seznamu s nevyskytuje. Chtěli bychom tedy, aby se výraz find s x vyhodnotil na index prvního výskytu prvku x v seznamu s a na nějakou hodnotu "nenašel jsem" v případě, že se x v seznamu s nevyskytuje. Přesně pro takové případy zde máme datový typ Maybe a.

Možná něco vrátím, možná ne

Typ Maybe a je definován následovně:

data Maybe a  =  Nothing  |  Just a
Krabička Maybe Int obsahuje například hodnoty
Just 5
Just 4
Just (-6)
Nothing
Just 3
Just 0

Funkci find tedy můžeme definovat následovně:

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 Just n
                              else find1 s x (n+1)
Funkce find1 je pomocná funkce. Definovali jsme ji z toho důvodu, že si potřebujeme při procházení seznamu uchovávat informaci o tom, kolik prvků jsme již prošli. Tato informace se vždy nachází ve třetím argumentu.