Wykład 5
Basics/Lecture05.hs
Przypomnienie (jeszcze raz) 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ą aksjomaty dla mnożenia i jedności monady:
join . (fmap join) = join . join
join . (fmap return) = join . return = id
f >=> g = join . (fmap g) . f
xs >>= g = (join . fmap g) xs
xs >>= \x -> f x
do
x <- xs
f x
tail' xs >>= head'
do
ys <- tail' xs
head' ys
Operacje return i >>= są w tym przypadku następujących typów:
return : a -> [a]
>>= : [a] -> (a -> [b]) -> [b]
triple = \x -> [x,x,x]
["Bunny"] >>= triple >>= triple
fib = 0 : 1 : do
(x,y) <- zip fib $ tail fib
return x+y
W wersji syntactic sugar mamy:
fib = 0 : 1 : [ x+y | (x,y) <- zip fib $ tail fib ]
State s a = State { runState :: s -> (a,s) }
- Definiujemy nowy typ danych State1 s a izomorficzny z wyjściowym.
- (Dygresja!) Interpretujemy komunikat HLS dotyczący data vs. newtype.
Przykład:
data Point = Point (Double, Double)
newtype Point = Point (Double, Double)
Różnica reprezentacji w runtime:
Point (,)
| / \
(,) Double Double
/ \
Double Double
- Definiujemy instancje Functor i Monad dla State s a.