
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