It's very different, I think.

* 'evaluate' is in the IO monad, and (should) guarantee to evaluate the argument
  before proceeding, so if evaluating the argument to WHNF diverges or throws a 
exception, 
  any exceptions thrown (in the IO monad at least) after the 'evaluate'
  should not happen.  For example:
         evaluate (throw "first") >> throwIO (userError "second")
  should guaranteed to throw "first" and not "second".
  (The current bug is the 'evaluate' doesn't meet its guarantee.)

* Strict application ($!) is not in the IO monad, so it merely makes a 
strictness
  guarantee.  It doesn't guarantee to make exceptions in the argument "beat" 
  exceptions in the function.  For example
         ((:) $! (throw "second")) $! (throw "first")
  does *not* guaranteed to throw "first" rather than "second".

Does that distinction make sense?  Perhaps the contrast is a useful one. I 
wonder where it might be documented?

Simon

| -----Original Message-----
| From: glasgow-haskell-bugs-boun...@haskell.org [mailto:glasgow-haskell-bugs-
| boun...@haskell.org] On Behalf Of Don Stewart
| Sent: 04 May 2011 04:49
| To: glasgow-haskell-bugs@haskell.org; ezy...@mit.edu
| Subject: Re: [GHC] #5129: "evaluate" optimized away
| 
| That's a very common idiom. Interestingly, we have:
| 
| -- | Strict (call-by-value) application, defined in terms of 'seq'.
| ($!)    :: (a -> b) -> a -> b
| #ifdef __GLASGOW_HASKELL__
| f $! x  = let !vx = x in f vx  -- see #2273
| #elif !defined(__HUGS__)
| f $! x  = x `seq` f x
| 
| 
| On Tue, May 3, 2011 at 5:13 PM, GHC <cvs-...@haskell.org> wrote:
| > #5129: "evaluate" optimized away
| > ---------------------------------+-----------------------------------------
| -
| >    Reporter:  dons              |        Owner:  simonmar
| >        Type:  bug               |       Status:  new
| >    Priority:  normal            |    Milestone:
| >   Component:  Compiler          |      Version:  7.0.3
| >    Keywords:  seq, evaluate     |     Testcase:
| >   Blockedby:                    |   Difficulty:
| >          Os:  Unknown/Multiple  |     Blocking:
| > Architecture:  Unknown/Multiple  |      Failure:  Incorrect result at
| runtime
| > ---------------------------------+-----------------------------------------
| -
| >
| > Comment(by ezyang):
| >
| >  One rather user-visible result of this ticket is that we should now
| >  discourage the use of the idiom
| >
| >  {{{
| >  x `seq` return ()
| >  }}}
| >
| >  I can see a few instances of this in `base`
| >
| >  {{{
| >  ezyang@javelin:~/Dev/ghc-master/libraries/base$ grep -R '`seq` return ()'
| >  .
| >  ./Foreign/C/String.hs:        go [] n     = n `seq` return () -- make it
| >  strict in n
| >  ./Foreign/C/String.hs:        go [] n     = n `seq` return () -- make it
| >  strict in n
| >  ./GHC/IO/Handle/Text.hs:    c `seq` return ()
| >  ./GHC/Conc/Windows.hs:  r `seq` return () -- avoid space leak
| >  }}}
| >
| >  and there are probably more elsewhere.
| >
| > --
| > Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5129#comment:6>
| > GHC <http://www.haskell.org/ghc/>
| > The Glasgow Haskell Compiler
| >
| > _______________________________________________
| > Glasgow-haskell-bugs mailing list
| > Glasgow-haskell-bugs@haskell.org
| > http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
| >
| 
| _______________________________________________
| Glasgow-haskell-bugs mailing list
| Glasgow-haskell-bugs@haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs


_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to