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 { } diff --git a/src/Control/Monad.purs b/src/Control/Monad.purs index e7b6e4c..4ec415a 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 @@ -11,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 {}