
Am Freitag 16 April 2010 20:50:21 schrieb Philip Scott:
Prelude Control.Exception> let lst = [undefined,undefined] :: [Bool] Prelude Control.Exception> evaluate lst>>= putStrLn . take 1 . show [ Prelude Control.Exception> evaluate lst>>= print [*** Exception: Prelude.undefined
Ahh, yes you are of course right. Hmm so, how do we crack this nut without resorting to deepSeq etc.. It must be possible, because it happens when you print it!
When you print it, show demands that the value be completely evaluated. If the data-dependencies require an expression to be completely evaluated, it will be done. And that's basically the only way to get expressions evaluated. 'seq' and its relatives only give you a means to introduce new (artificial) data-dependencies.
Am I going to have to resort to physically writing the output to /dev/null ?
I think deepseq/rnf from Control.DeepSeq and NFData instances may be easier than writing stuff to /dev/null.
It seems like such an ordinary thing to want to do,
Not really. Wanting something to be completely evaluated without a direct need from data-dependencies is something not too ordinary in a lazy language. Of course, you sometimes need it, that's why there are seq and NFData. But it remains something special.
the fact that it is hard makes me think I must be approaching this in the wrong way (which is usually the case when I get my knickers in a twist with Haskell ;)
- Phil