[Haskell-cafe] More ideas for controlled mutation
Edward Z. Yang
ezyang at MIT.EDU
Sat Apr 30 16:54:58 CEST 2011
Excerpts from Heinrich Apfelmus's message of Mon Apr 25 04:01:03 -0400 2011:
> The thing is that lazy evaluation is referentially transparent while "I
> don't care about [(1,4),(2,2)] vs [(2,2),(1,4)]" is not.
Perhaps more precisely, laziness's memoization properties rely on the
referential transparency of thunk evaluation.
> In the latter case, you have a proof obligation to the compiler that your API
> does not expose the difference between these two values. But in Haskell, you
> have no way of convincing the compiler that you fulfilled that proof
> obligation! (At least, I don't see any obvious one. Maybe a clever abuse of
> parametricity helps.) It might be an option in Agda, though.
>
> In that light, it is entirely reasonable that you have to use
> unsafePerformIO .
Yes, of course. But as works like 'amb' demonstrate, we can build higher-level
APIs that are unsafe under the hood, but when used as abstractions fulfill
referential transparency (or, in the case of 'amb', fulfill referential
transparency as long as some not-as-onerous properties are achieved.) So if
you implement a reusable mechanism that does unsafe stuff under the hood,
but provides all the right guarantees as long as you don't peek inside, I
think that's a good step.
Cheers,
Edward
More information about the Haskell-Cafe
mailing list