I'm not certain this applies, but it should be possible to force evaluation order with a technique similar to deepSeq. It might be cleaner than using IO.
I think in this case, I'd prefer to use the IO monad. 1) It keeps the sequencing very, very explicit and not likely to be confused with a strictness annotation. seq is more about performance than semantics and, although all current Haskell compilers happen to impose some sequencing on the evaluation order of seq's arguments, future compilers could break that property and still be semantically correct. 2) To use seq, I have to link the evaluation of the error check to the evaluation of something else. It's not quite clear what a good choice would be. Point #1 is my main reason. -- Alastair Reid www.haskell-consulting.com