Wykład 7
Basics/Lecture07.hs
Niech (m, join, return) będzie monadą. Wtedy istnieje naturalna struktura monad na następujących funktorach:
- m . Maybe
- m . (Either a)
- s -> m ( , s)
- Monoid w => m ( , w)
- ...
Nie jest zawsze prawdą to, że złożenie dowolnych dwóch monad na danej kategorii jest monadą!
m ~> t m -- nowa monada.
Formalnie, w Haskellu transfomery monad zdefiniowane są przez zdefiniowanie:
- Parametrycznego typu danych
t :: ( * -> * ) -> * -> *
- Instancji klasy:
class MonadTrans t where
lift :: Monad m => m a -> t m a
- Dla każdej monady m zdefiniowanie instancji klasy Monad dla t m.
newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
Napisać definicję instancji transformaty StateT.
Przykład 1.
type Cost = State Int
type ExtraCost = StateT Double Cost
Przykład 2.
type MaybeIO = MaybeT IO