diff --git a/Control/Monad/Extra.hs b/Control/Monad/Extra.hs
--- a/Control/Monad/Extra.hs
+++ b/Control/Monad/Extra.hs
@@ -12,6 +12,7 @@
 import Control.Monad.Trans.Control
 import Data.IORef
 import Data.Maybe (catMaybes)
+import System.IO.Unsafe
 
 -- | Synonym for @return ()@.
 skip :: Monad m => m ()
@@ -209,3 +210,18 @@
             as <- sequenceWhile p ms
             return (a:as)
         else return []
+
+-- | Monadic equivalent to 'iterate'.  Note that it will not terminate, but may
+--   still be useful in the main event loop of a program, for example.
+iterateM :: Monad m => (a -> m a) -> a -> m [a]
+iterateM f x = do
+    x' <- f x
+    (x':) `liftM` iterateM f x'
+
+-- | A monadic version of 'iterate' which produces an infinite sequence of
+--   values using lazy I/O.
+lazyIterateM :: (Monad m, MonadBaseControl IO m) => (a -> m a) -> a -> m [a]
+lazyIterateM f x = do
+    y <- f x
+    z <- control $ \run -> unsafeInterleaveIO $ run $ iterateM f y
+    return (y:z)
diff --git a/monad-extras.cabal b/monad-extras.cabal
--- a/monad-extras.cabal
+++ b/monad-extras.cabal
@@ -1,5 +1,5 @@
 name:           monad-extras
-version:        0.5.5
+version:        0.5.6
 synopsis:       Extra utility functions for working with monads
 -- description:
 homepage:       http://github.com/jwiegley/monad-extras
