Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:pp:haskell:lab-monads [2020/05/25 03:56] msl [A po co to?] |
pl:dydaktyka:pp:haskell:lab-monads [2020/06/01 15:34] (aktualna) msl [Zadania:] |
==== Notacja 'Do' ==== | ==== Notacja 'Do' ==== |
| |
Operatory ''%%>>=%%'' i ''%%>>%%'' mają na celu tworzenia łańcuchów przekształceń danej monady, ale ich użycie jest dość niewygodne - szczególnie w przypadkach długich łańcuchów, w których są błędy. Dlatego powstała notacja ''do'', której używaliśmy na poprzednich zajęciach --- ''IO'' to też monada! Zacznijmy od w miarę złożonego łąńucha ''%%>>='': | Operatory ''%%>>=%%'' i ''%%>>%%'' mają na celu tworzenia łańcuchów przekształceń danej monady, ale ich użycie jest dość niewygodne - szczególnie w przypadkach długich łańcuchów, w których są błędy. Dlatego powstała notacja ''do'', której używaliśmy na poprzednich zajęciach --- ''IO'' to też monada! Zacznijmy od w miarę złożonego łąńucha ''%%>>=%%'': |
| |
<code haskell> | <code haskell> |
===== Zadania: ===== | ===== Zadania: ===== |
| |
- Zaimplementuj klasę ''Functor'' dla typu ''Tree'' zdefiniowanego na [[https://ai.ia.agh.edu.pl/pl:dydaktyka:pp:haskell:lab-types|poprzednich zajęciach]] | Dzisiejsze zadania będą dotyczyć drzewa binarnego opisanego w następujący sposób: |
- Zaimplementuj klasę ''Monad'' dla tego samego typu [[https://ai.ia.agh.edu.pl/pl:dydaktyka:pp:haskell:lab-types|''Tree'']] | |
- Przeczytaj o monadzie [[http://learnyouahaskell.com/for-a-few-monads-more#state|State]]. Zaimplementuj wszystkie operacje na drzewie z poprzednich zajęć jako //stateful computations//. | <code haskell> |
| data Tree a = Empty | Leaf a | Node (Tree a) (Tree a) |
| </code> |
| |
| - Zaimplementuj klasę ''Functor'' dla nowego typu ''Tree''. |
| - 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// dla **starego** drzewa z [[https://ai.ia.agh.edu.pl/pl:dydaktyka:pp:haskell:lab-types|poprzedniego laboratorium]]: |
| * insert - umieszcza element w drzewie |
| * 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 |
| - Zadanie ekstra - zaimplementuj te same operacje dla nowego drzewa |
| * podpowiedź: {{tree.png?linkonly=yes}} |
| |
| <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ą). |
| Klasa ''Applicative'' umożliwa używanie funkcji opakowanych monadą. |
| |
| 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'' |
| * ''%%<*>%%'' aplikuje funkcję opakowaną monadą, taki ''fmap'', który wyjmuje funkcję z pudełka, a nie ma go pod ręką |
| |
| <code haskell> |
| instance Applicative Tree where |
| pure x = Leaf x |
| _ <*> Empty = Empty |
| (Leaf f) <*> (Leaf x) = Leaf (f x) |
| (Leaf f) <*> (Node x y) = Node (fmap f x) (fmap f y) |
| </code> |
| |
| </WRAP> |