[Haskell-beginners] Re: Forcing evalation in the IO Monad
Daniel Fischer
daniel.is.fischer at web.de
Fri Apr 16 15:47:57 EDT 2010
Am Freitag 16 April 2010 21:14:54 schrieb Stephen Blackheath [to Haskell-
Beginners]:
>
> "evaluate x" is defined as "return $! x".
Not quite:
Prelude Control.Exception> evaluate (undefined :: Int) `seq` True
True
Prelude Control.Exception> ((return $! undefined) :: IO Int) `seq` True
*** Exception: Prelude.undefined
Haddocks:
"Forces its argument to be evaluated to weak head normal form when the
resultant IO action is executed. It can be used to order evaluation with
respect to other IO operations; its semantics are given by
evaluate x `seq` y ==> y
evaluate x `catch` f ==> (return $! x) `catch` f
evaluate x >>= f ==> (return $! x) >>= f
Note: the first equation implies that (evaluate x) is not the same as
(return $! x). A correct definition is
evaluate x = (return $! x) >>= return
"
> This indeed evaluates the
> value immediately then and there. It *only* evaluates to WHNF (weak
> head normal form). For number values, WHNF (= evaluate to outer
> constructor only) and NF (= completely evaluate) are the same thing, as
> shown in your example above. The (a * 2) makes no difference, because
> whether WHNF = NF or not depends on the type of the value only, not the
> expression used to calculate it.
>
> To evaluate x to NF (completely) then and there in general, you have to
> say
>
> evaluate (rnf x)
>
> where rnf is defined in Control.DeepSeq in the 'deepseq' package. The
> type of x has to be an NFData instance. Haskell does not provide any
> other way to force evaluation to NF other than to explicitly use `seq`
> on each element of the structure. The purpose of DeepSeq is to make
> this task easier.
>
>
> Steve
More information about the Beginners
mailing list