Unsafe hGetContents
Nicolas Pouillard
nicolas.pouillard at gmail.com
Tue Oct 6 09:18:27 EDT 2009
Excerpts from Simon Marlow's message of Tue Oct 06 14:59:06 +0200 2009:
> On 03/10/2009 19:59, Florian Weimer wrote:
> > * Nicolas Pouillard:
> >
> >> Excerpts from Florian Weimer's message of Wed Sep 16 22:17:08 +0200 2009:
> >>> Are there any plans to get rid of hGetContents and the semi-closed
> >>> handle state for Haskell Prime?
> >>>
> >>> (I call hGetContents unsafe because it adds side effects to pattern
> >>> matching, stricly speaking invalidating most of the transformations
> >>> which are expected to be valid in a pure language.)
> >>
> >> Would you consider something like [1] as an acceptable replacement?
> >>
> >> [1]: http://hackage.haskell.org/package/safe-lazy-io
> >
> > It only addresses two known issues with lazy I/O, doesn't it? It
> > still injects input operations into pure code not in the IO monad.
>
> While what you say is true, and I've complained about the same thing
> myself in the past, it turns out to be quite difficult to demonstrate
> the unsafety.
>
> Try it! Here's the rules.
>
> - write a program that gives different results when compiled with
> different optimisation flags only. (one exception: you're not
> allowed to take advantage of -fno-state-hack).
>
> - Using exceptions is not allowed (they're non-determinstic).
>
> - A difference caused by resources (e.g. stack overflow) doesn't
> count.
>
> - The only "unsafe" operation you're allowed to use is hGetContents.
>
> - You're allowed to use any other I/O operations, including from
> libraries, as long as they're not unsafe, and as long as the I/O
> itself is deterministic.
>
> The reason it's hard is that to demonstrate a difference you have to get
> the lazy I/O to commute with some other I/O, and GHC will never do that.
> If you find a way to do it, then we'll probably consider it a bug in GHC.
>
> You can get lazy I/O to commute with other lazy I/O, and perhaps with
> some cunning arrangement of pipes (or something) that might be a way to
> solve the puzzle. Good luck!
Oleg's example is quite close, don't you think?
URL: http://www.haskell.org/pipermail/haskell/2009-March/021064.html
Cheers,
--
Nicolas Pouillard
http://nicolaspouillard.fr
More information about the Haskell-prime
mailing list