From 4650b6c9f30c3992cb2c85727089662d50c46814 Mon Sep 17 00:00:00 2001 From: Eric Easley Date: Wed, 18 Mar 2015 09:36:44 -0400 Subject: [PATCH 1/2] Added filterM --- README.md | 7 +++++++ src/Control/Monad.purs | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/README.md b/README.md index 93a7a0e..2486b4b 100644 --- a/README.md +++ b/README.md @@ -297,6 +297,13 @@ unless :: forall m. (Monad m) => Boolean -> m Unit -> m Unit ``` +#### `filterM` + +``` purescript +filterM :: forall a m. (Monad m) => (a -> m Boolean) -> [a] -> m [a] +``` + + ## Module Control.MonadPlus diff --git a/src/Control/Monad.purs b/src/Control/Monad.purs index 639bfd5..50a778b 100644 --- a/src/Control/Monad.purs +++ b/src/Control/Monad.purs @@ -18,3 +18,12 @@ when false _ = return unit unless :: forall m. (Monad m) => Boolean -> m Unit -> m Unit unless false m = m unless true _ = return unit + +filterM :: forall a m. (Monad m) => (a -> m Boolean) -> [a] -> m [a] +filterM _ [] = return [] +filterM p (x:xs) = do + b <- p x + xs' <- filterM p xs + return $ if b + then x : xs' + else xs' From b17994e1b213f4364e6595090a06ab1570437f18 Mon Sep 17 00:00:00 2001 From: Eric Easley Date: Wed, 18 Mar 2015 15:40:47 -0400 Subject: [PATCH 2/2] Added filterM comment --- README.md | 6 ++++++ src/Control/Monad.purs | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 2486b4b..8258e5e 100644 --- a/README.md +++ b/README.md @@ -303,6 +303,12 @@ unless :: forall m. (Monad m) => Boolean -> m Unit -> m Unit filterM :: forall a m. (Monad m) => (a -> m Boolean) -> [a] -> m [a] ``` +Filter where the predicate returns a monadic Boolean. For example: + +```purescript +powerSet :: forall a. [a] -> [[a]] +powerSet = filterM (const [true, false]) +``` ## Module Control.MonadPlus diff --git a/src/Control/Monad.purs b/src/Control/Monad.purs index 50a778b..35618d0 100644 --- a/src/Control/Monad.purs +++ b/src/Control/Monad.purs @@ -19,6 +19,12 @@ unless :: forall m. (Monad m) => Boolean -> m Unit -> m Unit unless false m = m unless true _ = return unit +-- | Filter where the predicate returns a monadic Boolean. For example: +-- | +-- | ```purescript +-- | powerSet :: forall a. [a] -> [[a]] +-- | powerSet = filterM (const [true, false]) +-- | ``` filterM :: forall a m. (Monad m) => (a -> m Boolean) -> [a] -> m [a] filterM _ [] = return [] filterM p (x:xs) = do