[Haskell-cafe] Re: evaluate vs seq
apfelmus at quantentunnel.de
apfelmus at quantentunnel.de
Sun Sep 10 07:18:25 EDT 2006
Michael Shulman wrote:
> The GHC documentation says that (evaluate a) is not the same as (a
> `seq` return a). Can someone explain the difference to me, or point
> me to a place where it is explained?
(evaluate a) is "weaker" than (a `seq` return a). (a `seq` return a) is
always _|_ whereas (evaluate a) is not _|_, but does throw an exception
when executed. The appended code shows the differences.
Regards,
apfelmus
import Prelude hiding (return,catch)
import qualified Control.Monad as M
import Control.Exception
a = undefined :: ()
return = M.return :: a -> IO a
e 0 = return a
e 1 = a `seq` return a
e 2 = evaluate a
t x = e x >> return ()
-- t 0 == return ()
-- t 1 == throwIO something
-- t 2 == throwIO something
-- to check this, evaluate the expressions
-- (t x >>= print) and (t x `seq` ())
u x = e x `seq` return ()
-- u 0 == return ()
-- u 1 == undefined
-- u 2 == return ()
-- to check this, type (u x >>= print) into hugs/ghci
v x = catch (e x) (\_ -> return ()) >>= print
-- v 0 == throwIO something
-- v 1 == print ()
-- v 2 == print ()
More information about the Haskell-Cafe
mailing list