diff --git a/Control/Monad/Tools.hs b/Control/Monad/Tools.hs
--- a/Control/Monad/Tools.hs
+++ b/Control/Monad/Tools.hs
@@ -6,6 +6,7 @@
 , doWhile
 , for_
 , for
+, filterM
 , skipRet
 ) where
 
@@ -37,6 +38,14 @@
 for i test next j act
   | test i    = act i j >>= flip (for (next i) test next) act
   | otherwise = return j
+
+filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]
+filterM _ []     = return []
+filterM p (x:xs) = do
+  b  <- p x
+  rs <- filterM p xs
+  if b then return $ x:rs
+       else return     rs
 
 skipRet :: Monad m => m b -> a -> m a
 skipRet p x = p >> return x
diff --git a/yjtools.cabal b/yjtools.cabal
--- a/yjtools.cabal
+++ b/yjtools.cabal
@@ -1,5 +1,5 @@
 Name:		yjtools
-Version:	0.9.6
+Version:	0.9.7
 Cabal-Version:	>= 1.2
 Build-Type:	Simple
 License:	LGPL
