From 324ac4e800b2ba4a6fe010a2452a9f7ce220104c Mon Sep 17 00:00:00 2001 From: Gary Burgess Date: Mon, 19 May 2014 12:57:19 +0100 Subject: [PATCH 1/3] Add MonadZero and MonadPlus --- src/Control/Monad.purs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Control/Monad.purs b/src/Control/Monad.purs index e7b6e4c..90af9a9 100644 --- a/src/Control/Monad.purs +++ b/src/Control/Monad.purs @@ -1,5 +1,11 @@ module Control.Monad where +class (Monad m) <= MonadZero m where + mzero :: forall a. m a + +class (MonadZero m) <= MonadPlus m where + mplus :: forall a. m a -> m a -> m a + replicateM :: forall m a. (Monad m) => Number -> m a -> m [a] replicateM 0 _ = return [] replicateM n m = do From 7e6cf149a22a8f82094b530cfab928d6a8d799a5 Mon Sep 17 00:00:00 2001 From: Gary Burgess Date: Mon, 19 May 2014 22:35:56 +0100 Subject: [PATCH 2/3] Add `guard` --- src/Control/Monad.purs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Control/Monad.purs b/src/Control/Monad.purs index 90af9a9..4ec415a 100644 --- a/src/Control/Monad.purs +++ b/src/Control/Monad.purs @@ -17,6 +17,10 @@ foldM :: forall m a b. (Monad m) => (a -> b -> m a) -> a -> [b] -> m a foldM _ a [] = return a foldM f a (b:bs) = f a b >>= \a' -> foldM f a' bs +guard :: forall m. (MonadPlus m) => Boolean -> m Unit +guard true = return unit +guard false = mzero + when :: forall m. (Monad m) => Boolean -> m {} -> m {} when true m = m when false _ = return {} From e78cb33858a7a9c8fb6a42e5dbd0d649c8422b16 Mon Sep 17 00:00:00 2001 From: Gary Burgess Date: Mon, 19 May 2014 22:36:00 +0100 Subject: [PATCH 3/3] Update docs --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 39482b0..90f776e 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,21 @@ ## Module Control.Monad +### Type Classes + + class (MonadZero m) <= MonadPlus m where + mplus :: forall a. m a -> m a -> m a + + class (Monad m) <= MonadZero m where + mzero :: forall a. m a + + ### Values foldM :: forall m a b. (Monad m) => (a -> b -> m a) -> a -> [b] -> m a + guard :: forall m. (MonadPlus m) => Prim.Boolean -> m Unit + replicateM :: forall m a. (Monad m) => Prim.Number -> m a -> m [a] unless :: forall m. (Monad m) => Prim.Boolean -> m { } -> m { }