Created
July 20, 2018 10:40
-
-
Save revskill10/c66246968ec92d54b8f4e35f9783c37f to your computer and use it in GitHub Desktop.
Monad Transformer - Part 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
newtype Arr2T e1 e2 m a = Arr2T { getArr2T :: e1 -> e2 -> m a } | |
newtype Arr3T e1 e2 e3 m a = Arr3T { getArr3T :: e1 -> e2 -> e3 -> m a } | |
instance Functor m => Functor (Arr2T e1 e2 m) where | |
fmap f (Arr2T g) = Arr2T $ \e1 e2 -> fmap f (g e1 e2) | |
instance Functor m => Functor (Arr3T e1 e2 e3 m) where | |
fmap f (Arr3T g) = Arr3T $ \ e1 e2 e3 -> fmap f (g e1 e2 e3) | |
instance Applicative m => Applicative (Arr2T e1 e2 m) where | |
pure val = Arr2T $ \e1 e2 -> pure val | |
(Arr2T g1) <*> (Arr2T g2) = Arr2T $ \e1 e2 -> g1 e1 e2 <*> g2 e1 e2 | |
instance Applicative m => Applicative (Arr3T e1 e2 e3 m) where | |
pure val = Arr3T $ \e1 e2 e3 -> pure val | |
(Arr3T g1) <*> (Arr3T g2) = Arr3T $ \e1 e2 e3 -> g1 e1 e2 e3 <*> g2 e1 e2 e3 | |
instance Monad m => Monad (Arr2T e1 e2 m) where | |
return = pure | |
(Arr2T g1) >>= f = | |
Arr2T $ \e1 e2 -> do | |
a <- g1 e1 e2 | |
getArr2T (f a) e1 e2 | |
instance Monad m => Monad (Arr3T e1 e2 e3 m) where | |
return = pure | |
(Arr3T g1) >>= f = | |
Arr3T $ \e1 e2 e3 -> do | |
a <- g1 e1 e2 e3 | |
getArr3T (f a) e1 e2 e3 | |
{- | |
a2l = Arr2T $ \e1 e2 -> [e1,e2] | |
getArr2T (do {x <- a2l; y <- a2l; return (x + y)}) 3 5 | |
[6,8,8,10] | |
-} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment