Skip to content

Instantly share code, notes, and snippets.

@revskill10
Created July 20, 2018 10:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save revskill10/c66246968ec92d54b8f4e35f9783c37f to your computer and use it in GitHub Desktop.
Save revskill10/c66246968ec92d54b8f4e35f9783c37f to your computer and use it in GitHub Desktop.
Monad Transformer - Part 2
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