Generalize `Control.Monad.forever`
authorBen Gamari <ben@smart-cactus.org>
Tue, 7 Jul 2015 15:07:06 +0000 (17:07 +0200)
committerBen Gamari <ben@smart-cactus.org>
Tue, 7 Jul 2015 17:17:56 +0000 (19:17 +0200)
This generalizes forever to depend on Applicative, rather than Monad.

This was proposed a month ago
(https://mail.haskell.org/pipermail/libraries/2015-May/025711.html).

Differential Revision: https://phabricator.haskell.org/D1045

libraries/base/Control/Monad.hs
libraries/base/changelog.md

index 6fa4a07..be3765d 100644 (file)
@@ -113,9 +113,9 @@ f >=> g     = \x -> f x >>= g
 (<=<)       = flip (>=>)
 
 -- | @'forever' act@ repeats the action infinitely.
-forever     :: (Monad m) => m a -> m b
+forever     :: (Applicative f) => f a -> f b
 {-# INLINE forever #-}
-forever a   = let a' = a >> a' in a'
+forever a   = let a' = a *> a' in a'
 -- Use explicit sharing here, as it is prevents a space leak regardless of
 -- optimizations.
 
index 363210d..bb09199 100644 (file)
@@ -40,6 +40,8 @@
   * Generalize `Debug.Trace.{traceM, traceShowM}` from `Monad` to `Applicative`
     (#10023)
 
+  * Generalise `forever` from `Monad` to `Applicative`
+
 ## 4.8.1.0  *TBA*
 
   * Bundled with GHC 7.10.2