[Haskell-cafe] Top-level state debate on the wiki
k.schupke at imperial.ac.uk
Thu Dec 2 04:08:21 EST 2004
Ben Rudiak-Gould wrote:
Just a small comment on the Wiki page... it says
"Several real-life examples of pure haskell code which needs fast global
variables to either be implemented efficiently or statically guarantee
their invariants are given in
The first example is that of randomIO - not implementable in Haskell,
however the function,
randoms :: RandomGen g => g -> [a], is (and is probably more idomatic
The second example "Unique", can be implemented:
getUniqueSupply = do
a <- newIORef 0
return (nextUnique a)
nextUnqiue n = do
x <- readIORef n
writeIORef n (x+1)
Which should be just as fast as the global version, and all you do is
pass the 'unique' supply
around... you can even generate a lazy list of unqiues which can be used
outside the IO monad.
Again the "disadvantage" is that you can have multiple unique supplies
and you could use the "wrong" one... (which is an advantage in my
opinion, as it increases flexibility and reuse of the code).
The same applies to the AtomHash, it can be implemented just as
effieciently without globals...
The only difference appears to be the supposed ability of globals
stopping the programmer using an alternate Hash... but of course there
is nothing stopping the programmer using the
wrong global at all! (In other words it seems just as easy to access the
wrong top-level name as to pass the wrong parameter).
More information about the Haskell-Cafe