Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:pp:haskell:lab-monads [2020/05/25 12:40] msl [Zadania:] |
pl:dydaktyka:pp:haskell:lab-monads [2020/06/01 15:34] (aktualna) msl [Zadania:] |
| |
<code haskell> | <code haskell> |
data Tree a = Leaf a | Node (Tree a) (Tree a) | data Tree a = Empty | Leaf a | Node (Tree a) (Tree a) |
</code> | </code> |
| |
Różnice między drzewm z [[https://ai.ia.agh.edu.pl/pl:dydaktyka:pp:haskell:lab-types|poprzednich]] i dzisiejszych zajęć wynikają z tego, że w poprzedniej definicji dużo trudniej zaimplementować jest klasę Monady. | - Zaimplementuj klasę ''Functor'' dla nowego typu ''Tree''. |
| |
- Zaimplementuj klasę ''Functor'' dla typu ''Tree'' | |
- Zaimplementuj klasę ''Monad'' dla tego samego typu. | - Zaimplementuj klasę ''Monad'' dla tego samego typu. |
- Przeczytaj o monadzie [[http://learnyouahaskell.com/for-a-few-monads-more#state|State]]. Zaimplementuj poniższe operacje jako //stateful computations//: | - Przeczytaj o monadzie [[http://learnyouahaskell.com/for-a-few-monads-more#state|State]]. Zaimplementuj poniższe operacje jako //stateful computations// dla **starego** drzewa z [[https://ai.ia.agh.edu.pl/pl:dydaktyka:pp:haskell:lab-types|poprzedniego laboratorium]]: |
* insert - umieszcza element w drzewie | * insert - umieszcza element w drzewie |
* remove - usuwa element z drzewa i zwraca go jako wynik | * removeAll - usuwa wszystkie elementy spełniające zadany warunek z drzewa i zwraca je w liście jako wynik |
* search - sprawdza, czy element jest w drzewie | * search - sprawdza, czy element jest w drzewie |
| - Zadanie ekstra - zaimplementuj te same operacje dla nowego drzewa |
| * podpowiedź: {{tree.png?linkonly=yes}} |
| |
<WRAP center round important 60%> | <WRAP center round important 60%> |
UWAGA: w zależności od wersji Haskella, może być konieczne również zaimplementowanie klasy ''Applicative'' (jako wymagania do bycia monadą). | **UWAGA**: w zależności od wersji Haskella, może być konieczne również zaimplementowanie klasy ''Applicative'' (jako wymagania do bycia monadą). |
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: | 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'' :D | * ''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 gopod ręką | * ''%%<*>%%'' aplikuje funkcję opakowaną monadą, taki ''fmap'', który wyjmuje funkcję z pudełka, a nie ma go pod ręką |
| |
<code haskell> | <code haskell> |
instance Applicative Tree where | instance Applicative Tree where |
pure x = Leaf x | pure x = Leaf x |
| _ <*> Empty = Empty |
(Leaf f) <*> (Leaf x) = Leaf (f x) | (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) |