I did, yes. Works ok for me. 'forever' does has an INLINABLE pragma.. so I'm confused
S | -----Original Message----- | From: Manuel M T Chakravarty [mailto:[email protected]] | Sent: 10 June 2011 02:08 | To: Simon Peyton-Jones | Cc: [email protected] | Subject: Re: [commit: base] master: Make 'forever' inlinable (fixes Trac #5205) | (ae10342) | | Simon, | | Did you validate this? I get | | > libraries/base/GHC/ST.lhs:78:1: | > You cannot SPECIALISE `forever' | > because its definition has no INLINE/INLINABLE pragma | > (or you compiled its defining module without -O) | > make[1]: *** [libraries/base/dist-install/doc/html/base/base.haddock] Error 1 | | with a standard validate run on Mac OS X using 7.0.3 as the bootstrap compiler. | | Manuel | | | | > Repository : ssh://darcs.haskell.org//srv/darcs/packages/base | > | > On branch : master | > | > | http://hackage.haskell.org/trac/ghc/changeset/ae10342b49b95393b09ffee8df8c84740969996 | 8 | > | >> --------------------------------------------------------------- | > | > commit ae10342b49b95393b09ffee8df8c847409699968 | > Author: Simon Peyton Jones <[email protected]> | > Date: Thu Jun 9 20:44:21 2011 +0100 | > | > Make 'forever' inlinable (fixes Trac #5205) | > | > See Note [Make forever INLINABLE] in Control.Monad | > | >> --------------------------------------------------------------- | > | > Control/Monad.hs | 18 ++++++++++++++++++ | > GHC/ST.lhs | 4 ++++ | > 2 files changed, 22 insertions(+), 0 deletions(-) | > | > diff --git a/Control/Monad.hs b/Control/Monad.hs | > index 2bbfc57..75b9d0b 100644 | > --- a/Control/Monad.hs | > +++ b/Control/Monad.hs | > @@ -189,8 +189,26 @@ f >=> g = \x -> f x >>= g | > | > -- | @'forever' act@ repeats the action infinitely. | > forever :: (Monad m) => m a -> m b | > +{-# INLINABLE forever #-} -- See Note [Make forever INLINABLE] | > forever a = a >> forever a | > | > +{- Note [Make forever INLINABLE] | > + | > +If you say x = forever a | > +you'll get x = a >> a >> a >> a >> ... etc ... | > +and that can make a massive space leak (see Trac #5205) | > + | > +In some monads, where (>>) is expensive, this might be the right | > +thing, but not in the IO monad. We want to specialise 'forever' for | > +the IO monad, so that eta expansion happens and there's no space leak. | > +To achieve this we must make forever INLINABLE, so that it'll get | > +specialised at call sites. | > + | > +Still delicate, though, because it depends on optimisation. But there | > +really is a space/time tradeoff here, and only optimisation reveals | > +the "right" answer. | > +-} | > + | > -- | @'void' value@ discards or ignores the result of evaluation, such as the | return value of an 'IO' action. | > void :: Functor f => f a -> f () | > void = fmap (const ()) | > diff --git a/GHC/ST.lhs b/GHC/ST.lhs | > index dc62000..a66a5f8 100644 | > --- a/GHC/ST.lhs | > +++ b/GHC/ST.lhs | > @@ -20,6 +20,7 @@ module GHC.ST where | > | > import GHC.Base | > import GHC.Show | > +import Control.Monad( forever ) | > | > default () | > \end{code} | > @@ -74,6 +75,9 @@ instance Monad (ST s) where | > | > data STret s a = STret (State# s) a | > | > +{-# SPECIALISE forever :: ST s a -> ST s b #-} | > +-- See Note [Make forever INLINABLE] in Control.Monad | > + | > -- liftST is useful when we want a lifted result from an ST computation. See | > -- fixST below. | > liftST :: ST s a -> State# s -> STret s a | > | > | > | > _______________________________________________ | > Cvs-libraries mailing list | > [email protected] | > http://www.haskell.org/mailman/listinfo/cvs-libraries | _______________________________________________ Cvs-libraries mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-libraries
