
Just a few minor nitpicks... mainly about the necessity of using certain APIs, however I think we are in general agreement... Keean. John Meacham wrote:
That example solves a different problem, I was never claiming that there wern't efficient ways to solve the unique producer problem in general, just no efficient way to provide the interface as given in Data.Unique, a top level declaration of type 'IO Int'.
My argument would be program in the idomatic style of the language, rather than change the language. In other words it is not necessary to implement that API, it is a preference.
If you are allowed to replace code at will then nothing anywhere is guarenteed in haskell :) I mean you could replace head with head = error "No head for you." and a lot of libraries would break.
I am only talking about substitutimg modules... you can simply feed ghc a different search path with -i, and insert a wrapper around the module. My point was it is a possible way to take a third party library that supports only one global context and get it to support many contexts without changing a single line of code in the library itself, and this is a good thing IMHO.
Yes. but that has the same problem as your other example. it is a
different interface than the one we want. If we want to pass around the state we can use many of the other routines in Random. If we want to extend the world with the standard generator (which is perfectly reasonable, and useful enough to make it into the standard haskell libraries), we are out of luck.
But you can use this different interface - it may not be the one you would like - but it does the job. My point was it is not necessary to have a generator with the API you gave, again it is a preference.
Yeah, I imagine this functionality would be useful to implement debuggers like 'hat' where you need to collect 'meta-information' about a run of the program. again, I don't see the ability to replace library calls like IORef as a weakness in the guarentees provided by stuff that uses them, as it is up to the replacer of the libraries to do the right thing.
Yes, I think it is a sign of good modularity. Keean.