Skip to content

Commit 8d63888

Browse files
authored
add readerT (#32)
1 parent e19f2b0 commit 8d63888

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

MonadsAndEffects/3.4/arrs.hs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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

Comments
 (0)