
Thanks Udo, that helped a lot. I added the link to haskell.org. I couldn't find a proper place to put it, so I added a page 'By topic' (still quite empty) linked from the main page. (I hope that wasn't against any rules I missed; if anybody objects please feel free to remove it.) cheers, matthias On Thu, Feb 16, 2006 at 01:10:14PM +0100, Udo Stenzel wrote:
To: Matthias Fischmann
Cc: haskell-cafe@haskell.org From: Udo Stenzel Date: Thu, 16 Feb 2006 13:10:14 +0100 Subject: Re: [Haskell-cafe] enforcing strictness on arbitrary subexpressions Matthias Fischmann wrote:
I want to force evaluation on an arbitrary expression. [...]
main :: IO () main = do hPutStr stdout veryLongString -- lazy veryLongString `seq` hPutStr stdout veryLongString -- still lazy? (StrictThingy veryLongString) `seq` hPutStr stdout veryLongString -- strict (or at least i hope it is)
The last line is actually equivalent to the second. Strict data constructors are defined in term of seq, and seq only forces the evaluation of the outermost constructor. So after seq'ing a string, it is either empty or has at least one element, but that element and the whole tail are still unevaluated. You have to recurse into the string to evaluate everything:
hPutStr stdout $ foldr seq veryLongString veryLongString
There is no primitive to do this for arbitrary data types, but the DeepSeq type class comes close. You can find DeepSeq and some more hints on strict evaluation at http://users.aber.ac.uk/afc/stricthaskell.html.
Udo. -- Today is the tomorrow you worried about yesterday.