on master help sign in
Add RWST.
commita54b9fd90efcfb24e008725ab4f40a8650a35fd8 authorGeorge Leontiev <folone@gmail.com> dateThu 31 Oct 2013, 14:42 (13 years ago) parent9ca5cfa
5 files changed+86−21
lib/Control/Monad/RWS.idr+53 lib/Control/Monad/Reader.idr+4−2 lib/Control/Monad/State.idr+8−1 lib/Control/Monad/Writer.idr+17−15 lib/base.ipkg+4−3
lib/Control/Monad/RWS.idrnew file+53
@@ -0,0 +1,53 @@
1+module Control.Monad.RWS
2+
3+import Builtins
4+import Control.Monad.Identity
5+import Control.Monad.State
6+import Control.Monad.Writer
7+import Control.Monad.Reader
8+import Prelude.Monad
9+import Prelude.Functor
10+
11+%access public
12+
13+class (Monoid w, MonadReader r m, MonadWriter w m, MonadState s m) => MonadRWS r w s (m : Type -> Type) where {}
14+
15+record RWST : Type -> Type -> Type -> (Type -> Type) -> Type -> Type where
16+ MkRWST : {m : Type -> Type} ->
17+ (runRWST : r -> s -> m (a, s, w)) -> RWST r w s m a
18+
19+instance Monad m => Functor (RWST r w s m) where
20+ map f (MkRWST m) = MkRWST $ \r => \s => do (a, s', w) <- m r s
21+ return (f a, s', w)
22+
23+instance (Monoid w, Monad m) => Applicative (RWST r w s m) where
24+ pure a = MkRWST $ \_ => \s => return (a, s, neutral)
25+ (MkRWST f) <$> (MkRWST v) = MkRWST $ \r => \s => do (a, s', w) <- v r s
26+ (fn, ss, w') <- f r s
27+ return (fn a, ss, w <+> w)
28+
29+instance (Monoid w, Monad m) => Monad (RWST r w s m) where
30+ (MkRWST m) >>= k = MkRWST $ \r => \s => do (a, s', w) <- m r s
31+ let MkRWST ka = k a
32+ (b, ss, w') <- ka r s'
33+ return (b, ss, w <+> w')
34+
35+instance (Monoid w, Monad m) => MonadReader r (RWST r w s m) where
36+ ask = MkRWST $ \r => \s => return (r, s, neutral)
37+ local f (MkRWST m) = MkRWST $ \r => \s => m (f r) s
38+
39+instance (Monoid w, Monad m) => MonadWriter w (RWST r w s m) where
40+ tell w = MkRWST $ \_ => \s => return ((), s, w)
41+ listen (MkRWST m) = MkRWST $ \r => \s => do (a, s', w) <- m r s
42+ return ((a, w), s', w)
43+ pass (MkRWST m) = MkRWST $ \r => \s => do ((a, f), s', w) <- m r s
44+ return (a, s', f w)
45+
46+instance (Monoid w, Monad m) => MonadState s (RWST r w s m) where
47+ get = MkRWST $ \_ => \s => return (s, s, neutral)
48+ put s = MkRWST $ \_ => \_ => return ((), s, neutral)
49+
50+instance (Monoid w, Monad m) => MonadRWS r w s (RWST r w s m) where {}
51+
52+RWS : Type -> Type -> Type -> Type -> Type
53+RWS r w s a = RWST r w s Identity a
lib/Control/Monad/Reader.idr+4−2
@@ -11,7 +11,6 @@ import Prelude.Functor
1111class Monad m => MonadReader r (m : Type -> Type) where
1212 ask : m r
1313 local : (r -> r) -> m a -> m a
14− asks : (r -> a) -> m a
1514
1615record ReaderT : Type -> (Type -> Type) -> Type -> Type where
1716 RD : {m : Type -> Type} ->
@@ -39,7 +38,10 @@ instance Monad m => Monad (ReaderT r m) where
3938instance Monad m => MonadReader r (ReaderT r m) where
4039 ask = RD return
4140 local f (RD m) = RD $ m . f
42− asks f = RD $ return . f
41+
42+asks : MonadReader r m => (r -> a) -> m a
43+asks f = do r <- ask
44+ return (f r)
4345
4446Reader : Type -> Type -> Type
4547Reader r a = ReaderT r Identity a
lib/Control/Monad/State.idr+8−1
@@ -35,6 +35,13 @@ instance Monad m => MonadState s (StateT s m) where
3535 get = ST (\x => return (x, x))
3636 put x = ST (\y => return ((), x))
3737
38+modify : MonadState s m => (s -> s) -> m ()
39+modify f = do s <- get
40+ put (f s)
41+
42+gets : MonadState s m => (s -> a) -> m a
43+gets f = do s <- get
44+ return (f s)
45+
3846State : Type -> Type -> Type
3947State s a = StateT s Identity a
40−
lib/Control/Monad/Writer.idr+17−15
@@ -9,11 +9,9 @@ import Prelude.Functor
99%access public
1010
1111class (Monoid w, Monad m) => MonadWriter w (m : Type -> Type) where
12− tell : w -> m ()
13− listen : m a -> m (a, w)
14− listens : (w -> b) -> m a -> m (a, b)
15− pass : m (a, w -> w) -> m a
16− censor : (w -> w) -> m a -> m a
12+ tell : w -> m ()
13+ listen : m a -> m (a, w)
14+ pass : m (a, w -> w) -> m a
1715
1816record WriterT : Type -> (Type -> Type) -> Type -> Type where
1917 WR : {m : Type -> Type} ->
@@ -38,16 +36,20 @@ instance (Monoid w, Monad m) => Monad (WriterT w m) where
3836 return (b, w <+> w')
3937
4038instance (Monoid w, Monad m) => MonadWriter w (WriterT w m) where
41− tell w = WR $ return ((), w)
42− listen (WR m) = WR $ do (a, w) <- m
43− return ((a, w), w)
44− listens f (WR m) = WR $ do (a, w) <- m
45− return ((a, f w), w)
46− pass (WR m) = WR $ do ((a, f), w) <- m
47− return (a, f w)
48− censor f (WR m) = WR $ do (a, w) <- m
49− return (a, f w)
50−
39+ tell w = WR $ return ((), w)
40+ listen (WR m) = WR $ do (a, w) <- m
41+ return ((a, w), w)
42+ pass (WR m) = WR $ do ((a, f), w) <- m
43+ return (a, f w)
44+
45+listens : MonadWriter w m => (w -> b) -> m a -> m (a, b)
46+listens f m = listens' f (listen m) where
47+ listens' f' ma = do (a, w) <- ma
48+ return (a, f' w)
49+
50+censor : MonadWriter w m => (w -> w) -> m a -> m a
51+censor f m = pass $ do a <- m
52+ return (a, f)
5153
5254Writer : Type -> Type -> Type
5355Writer w a = WriterT w Identity a
lib/base.ipkg+4−3
@@ -28,7 +28,8 @@ modules = Builtins, Prelude, IO, System,
2828 Data.SortedMap, Data.SortedSet, Data.BoundedList,
2929 Data.Vect, Data.HVect, Data.Vect.Quantifiers,
3030
31− Control.Monad.Identity, Control.Monad.State, Control.Category,
32− Control.Monad.Writer, Control.Monad.Reader,
33− Control.Arrow,
31+ Control.Monad.Identity,
32+ Control.Monad.RWS,
33+ Control.Monad.State, Control.Monad.Writer, Control.Monad.Reader,
34+ Control.Category, Control.Arrow,
3435 Control.Catchable, Control.IOExcept