On Tue, 2 Sep 2008, Adrian Hey wrote:
Ganesh Sittampalam wrote:
You see this as a requirement that can be discharged by adding the ACIO
concept; I see it as a requirement that should be communicated in the type.
Another way of looking at it is that Data.Unique has associated with it
some context in which Unique values are safely comparable. You want that
context to always be the top-level/RTS scope, I would like the defining
that context to be part of the API.
But why pick on Data.Unique as special? Because I just happened to have
pointed out it uses a "global variable"?
Only because I thought it was the running example.
If you didn't know this I suspect this issue just wouldn't be an issue
at all. Why haven't you raised a ticket complaining about it's API
having the "wrong" type sigs? :-)
Because I don't use it, and even if I did use it I would just live with
the API it has.
There's shed loads of information and semantic subtleties about pretty
much any operation you care to think of in the IO monad that isn't
communicated by it's type. All you know for sure is that it's weird,
because if it wasn't it wouldn't be in the IO monad.
It does actually claim a specification, namely that no two calls to
newUnique return values that compare equal.
We have to have something concrete to discuss and this is the simplest.
Like I said there are a dozen or so other examples in the base package
last time I counted
Would you mind listing them? It might help provide some clarity to the
discussion.
Here's what you can't find in the libs distributed with ghc. Note this
does not include all uses of unsafePerformIO. It only includes uses
to make a "global variable".
Thanks. It'd probably be a good addition to the wiki page on this topic
for these to be catalogued in terms of why they are needed, though I'm
(probably) not volunteering to do it :-)
Ganesh
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe