[Haskell-cafe] Re: [Haskell] Top Level <-
ganesh at earth.li
Sat Aug 30 08:07:08 EDT 2008
On Sat, 30 Aug 2008, Ashley Yakeley wrote:
> Ganesh Sittampalam wrote:
>> Every single call to newIORef, across the whole world, returns a different
> How do you know? How can you compare them, except in the same Haskell
I can write to one and see if the other changes.
>> The "same" one as a previous one can only be returned once the old one has
>> become unused (and GCed).
> Perhaps, but internally the IORef is a pointer value, and those pointer
> values might be the same. From the same perspective, one could say that
How can they be the same unless the memory management system is broken? I
consider different pointers on different machines or in different virtual
address spaces different too; it's the fact that they don't alias
> every single call to newUnique across the whole world returns a different
> value, but internally they are Integers that might repeat.
The thing about pointers is that they are managed by the standard
behaviour of memory allocation. This isn't true of Integers.
In fact this point suggests an implementation for Data.Unique that should
actually be safe without global variables: just use IORefs for the actual
Unique values. IORefs already support Eq, as it happens. That gives you
process scope for free, and if you want bigger scopes you can pair that
with whatever makes sense, e.g. process ID, MAC address, etc.
> Two IO executions are in the same "global scope" if their resulting
> values can be used in the same expression. Top-level <- declarations
> must execute at most once in this scope.
This brings us back to the RPC question, and indeed to just passing values
to somewhere else via FFI. I think you can work around some of that by
talking about ADTs that aren't serialisable (e.g. ban the class Storable),
but now we have different global scopes for different kinds of values, so
which scope do we use to define <- ?
More information about the Haskell-Cafe