[Haskell-cafe] Weak pointers and referential transparency???
Brian Hulley
brianh at metamilk.com
Tue Sep 12 16:14:10 EDT 2006
tpledger at ihug.co.nz wrote:
> Brian Hulley wrote:
> [...]
>> Ref.write proxiesRef $! (weakProxy : proxies)
>
> (This is nothing to do with your main question, but the
> strict application looks unnecessary there. Its right hand
> side is already a constructor cell.)
Yes, thanks for pointing this out.
>
> [...]
>> In other words, if the entry for the proxy
>> in the table stored in the Model dies, can
>> I be absolutely 100% sure that this means
>> the proxy no longer exists in any shape or
>> form in the running program?
>
> My reading of the semantics
> (http://haskell.org/ghc/docs/latest/html/libraries/base/System-Mem-Weak.html#4)
> is that you can be sure the proxy *object* is gone.
My problem is that I don't know what to make of the word "object" in the
context of Haskell ie when can I be sure that a value is actually being
represented as a pointer to a block of memory and not stored in registers or
optimized out? Or is the compiler clever enough to preserve the concept of
"object" despite such optimizations? I had been designing my Model/Proxy
data types with the Java notion of "everything is a pointer to an object"
but is this always correct relative to Haskell as a language or is it just a
consequence of the current GHC implementation?
>
> As for referential transparency...
>
> Fan-in:
> If you create equivalent proxies in different calls to
> createProxy, it's possible that they'll end up referring to
> the same object (e.g. if the compiler or RTS does something
> fancy, or you use a memoised smart constructor). So then a
> single live proxy object *could* protect many elements of
> your Weak Proxy list from scavenging.
>
> Fan-out:
> It would seem perverse to cry "referential transparency!"
> and spontaneously clone one of your proxy objects. That
> *could* lead to deRefWeak returning Nothing while an
> *equivalent* Proxy object is still alive. Might you run
> your program on an avant-garde distributed RTS? ;-)
Someone else might even if I don't! ;-)
In the meantime I found a better solution to my original problem without
needing to use weak pointers: I now make the proxy pull the changes from the
model instead of making the model push them to all registered proxies, so
there is no longer any need to have a table of registered proxies hence no
need for weak pointers.
Thanks,
Brian.
--
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.
http://www.metamilk.com
More information about the Haskell-Cafe
mailing list