Skip to content

Latest commit

 

History

History
88 lines (70 loc) · 1.64 KB

Lecture04.md

File metadata and controls

88 lines (70 loc) · 1.64 KB

Programowanie funkcyjne

Tomasz Brengos

Wykład 4

Kod wykładu

Basics/Lecture04.hs


Monady!

Przypomnienie definicji z teorii kategorii. Trójkę

(m, join, return)

nazywamy monadą, jeśli m jest funktorem oraz:

join   :: m (m a)   -> m a
return ::  a        -> m a

spełniają znane aksjomaty dla mnożenia i jedności monady:

join . (fmap join)   = join . join
join . (fmap return) = join . return = id

W Haskellu bardziej przydatne jest składanie w kategorii Kleisli dla danej monady:

(>=>) :: (Monad m) => (a -> m b) -> (b -> m c) -> a -> m c

Wyraźmy >=> za pomocą join!

f >=> g = join. fmap g . f 

Okazuje się, że częściej W Haskellu używana jest operacji bind:

(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

Definicja instancji Monad zawiera:

(>>=)  :: (Monad m) => m a -> (a -> m b) -> m b
return :: (Monad m) =>   a -> m a

Związek między >=> i >>= :

f >=> g = \x -> ( f x >>= g )

x >>= g = (const x >=> g) ()

Zacznijmy od (prawie) najprostrzej monady, czyli Maybe

Definicja instancji monady Maybe:

instance Monad Maybe where
  Nothing >>= _ = Nothing
  Just x  >>= f = f x

  return = Just

Pobawmy się kodem. Funkcje head i tail w Haskellu są częściowe. Możemy je poprawić:

head' :: [a] -> Maybe a
head' []     = Nothing
head' (x:xs) = Just x

tail' :: [a] -> Maybe [a]
tail' []     = Nothing
tail' (x:xs) = Just xs

Zadanie:

Używając head' i tail' napisać funkcję która zwraca 3ci element z wejściowej listy:

third :: [a] -> Maybe a