Różnice
Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Ostatnia wersja
Both sides next revision
|
pl:dydaktyka:pp:haskell:lab-monads [2020/05/25 15:35] msl [Zadania:] |
pl:dydaktyka:pp:haskell:lab-monads [2020/05/25 16:07] msl [Zadania:] |
| |
<code haskell> | <code haskell> |
data Tree a = Empty | Node (Tree a) (Tree a) | data Tree a = Empty | Leaf a | Node (Tree a) (Tree a) |
</code> | </code> |
| |
Klasa ''Applicative'' umożliwa używanie funkcji opakowanych monadą. | Klasa ''Applicative'' umożliwa używanie funkcji opakowanych monadą. |
| |
Poniżej jest przykładowa implementacja ''Applicative'', która jest poprawna, ale nie dba o porządek elementów w drzewie (lepszej nam nie trzeba raczej na dzisiaj): | Poniżej jest przykładowa implementacja ''Applicative'', która jest poprawna, ale akceptuje tylko pojedyncze funkcje opakowane w liściach - na dzisiaj wystarczy: |
* ''pure'' to dokładnie to samo, co ''return''. Tak naprawdę w Monadzie zawsze można pisać: ''return = pure'' | * ''pure'' to dokładnie to samo, co ''return''. Tak naprawdę w Monadzie zawsze można pisać: ''return = pure'' |
* ''%%<*>%%'' aplikuje funkcję opakowaną monadą, taki ''fmap'', który wyjmuje funkcję z pudełka, a nie ma go pod ręką | * ''%%<*>%%'' aplikuje funkcję opakowaną monadą, taki ''fmap'', który wyjmuje funkcję z pudełka, a nie ma go pod ręką |
pure x = Leaf x | pure x = Leaf x |
_ <*> Empty = Empty | _ <*> Empty = Empty |
| (Leaf f) <*> (Leaf x) = Leaf (f x) |
(Leaf f) <*> (Node x y) = Node (fmap f x) (fmap f y) | (Leaf f) <*> (Node x y) = Node (fmap f x) (fmap f y) |
</code> | </code> |