Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:dydaktyka:pp:haskell:lab-monads [2020/05/25 12:23]
msl [Zadania:]
pl:dydaktyka:pp:haskell:lab-monads [2020/06/01 15:34] (aktualna)
msl [Zadania:]
Linia 165: Linia 165:
 ===== 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//​.+
  
-<WRAP center round tip 60%> 
-Uwaga: może się okazać, że prostszą reprezentacją drzewa dla tego zadania jest drzewo: 
 <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>​  
 + 
 +  - 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>​ </​code>​
 +
 </​WRAP>​ </​WRAP>​
  
pl/dydaktyka/pp/haskell/lab-monads.1590402188.txt.gz · ostatnio zmienione: 2020/05/25 12:23 przez msl
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0