Stephen Hicks <stephenhi...@gmail.com> wrote:

> Magnus Therning wrote:
> > Martijn van Steenbergen wrote:
> >>
> >> Otherwise, you can use unsafeInterleaveIO: no unsafePerformIO or seq
> >> needed, but there's still "unsafe" in that name there. This works for me:
> ...
> > Thanks, that does indeed work, but it still requires that "unsafe" there so
> > I'm hesitant replacing the call to threadDelay with something more
> > complicated, where it isn't obviously safe.
>
> Sorry for the late reply, but I'd like to piggy-back on this.  It's my
> understanding that unsafeInterleaveIO is only unsafe insofar as it
> makes the IO lazy and so the IO may be performed later or never at all
> (if its return value is never wanted) and is therefore no less safe
> than, say, generating a list of IO actions as was suggested by an
> earlier reply.  It seems to me that its unsafeness is of a completely
> different nature than unsafePerformIO...  am I missing something?

There are two issues with unsafePerformIO:  The laziness makes
evaluation unpredictable to some extent, but that's intentional.  But
for example what if the IO computation throws an exception?  There is no
well-defined behaviour, not even a well-known convention.  For example,
hGetContents simply aborts, which makes errors undetectable.

All in all, unsafeInterleaveIO is a handy tool, but you need to be
careful about its side effects.


Greets,
Ertugrul.


-- 
nightmare = unsafePerformIO (getWrongWife >>= sex)
http://blog.ertes.de/


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to