|
| 1 | +module Arrs where |
| 2 | + |
| 3 | +import Control.Monad.Trans.Class |
| 4 | + |
| 5 | + |
| 6 | +newtype Arr2T e1 e2 m a = Arr2T { getArr2T :: e1 -> e2 -> m a } |
| 7 | +newtype Arr3T e1 e2 e3 m a = Arr3T { getArr3T :: e1 -> e2 -> e3 -> m a } |
| 8 | + |
| 9 | + |
| 10 | +arr2 :: Monad m => (e1 -> e2 -> a) -> Arr2T e1 e2 m a |
| 11 | +arr2 f = Arr2T $ \e1 e2 -> return $ f e1 e2 |
| 12 | + |
| 13 | +arr3 :: Monad m => (e1 -> e2 -> e3 -> a) -> Arr3T e1 e2 e3 m a |
| 14 | +arr3 f = Arr3T $ \e1 e2 e3 -> return $ f e1 e2 e3 |
| 15 | + |
| 16 | + |
| 17 | +instance Functor m => Functor (Arr2T e1 e2 m) where |
| 18 | + -- fmap :: (a -> b) -> f a -> f b |
| 19 | + fmap f arr2 = Arr2T $ fmap (fmap (fmap f)) $ getArr2T arr2 |
| 20 | + |
| 21 | + |
| 22 | +instance Functor m => Functor (Arr3T e1 e2 e3 m) where |
| 23 | + fmap f arr3 = Arr3T $ fmap (fmap (fmap (fmap f))) $ getArr3T arr3 |
| 24 | + |
| 25 | + |
| 26 | +instance Applicative m => Applicative (Arr2T e1 e2 m) where |
| 27 | + -- pure :: a -> f a |
| 28 | + pure a = Arr2T $ \_ _ -> pure a |
| 29 | + |
| 30 | + -- <*> :: f (a -> b) -> f a -> f b |
| 31 | + ff <*> fa = Arr2T $ \e1 e2 -> getArr2T ff e1 e2 <*> getArr2T fa e1 e2 |
| 32 | + |
| 33 | + |
| 34 | +instance Applicative m => Applicative (Arr3T e1 e2 e3 m) where |
| 35 | + pure a = Arr3T $ \_ _ _ -> pure a |
| 36 | + |
| 37 | + ff <*> fa = Arr3T $ \e1 e2 e3 -> getArr3T ff e1 e2 e3 <*> getArr3T fa e1 e2 e3 |
| 38 | + |
| 39 | + |
| 40 | +instance Monad m => Monad (Arr2T e1 e2 m) where |
| 41 | + -- >>= :: m a -> (a -> m b) -> m b |
| 42 | + ma >>= k = Arr2T $ \e1 e2 -> do |
| 43 | + a <- getArr2T ma e1 e2 |
| 44 | + getArr2T (k a) e1 e2 |
| 45 | + |
| 46 | + |
| 47 | +instance Monad m => Monad (Arr3T e1 e2 e3 m) where |
| 48 | + ma >>= k = Arr3T $ \e1 e2 e3 -> do |
| 49 | + a <- getArr3T ma e1 e2 e3 |
| 50 | + getArr3T (k a) e1 e2 e3 |
| 51 | + |
| 52 | + -- fail :: String -> m a |
| 53 | + fail err = Arr3T $ \_ _ _ -> fail err |
| 54 | + |
| 55 | + |
| 56 | +instance MonadTrans (Arr2T e1 e2) where |
| 57 | + -- lift :: Monad m => m a -> t m a |
| 58 | + lift m = Arr2T $ \_ _ -> m |
| 59 | + |
| 60 | + |
| 61 | +asks2 :: Monad m => (e1 -> e2 -> a) -> Arr2T e1 e2 m a |
| 62 | +asks2 f = Arr2T $ \e1 e2 -> return $ f e1 e2 |
0 commit comments