John Meacham wrote:

>On Wed, Nov 24, 2004 at 02:40:52PM +0000, Ben Rudiak-Gould wrote:
>
>>But they can all be implemented with George Russell's library plus safe
>>(pure) uses of unsafePerformIO.
>
>George Russell's library is precicly an invalid use of unsafePerformIO.
>[...] hiding it in a module doesn't make it go away.

Yes it does. :-) If each Haskell environment ships with a correct implementation of the library, then its interface is the only part that matters. If the unsafePerformIO hack doesn't work in your new Haskell compiler, you can replace it with some other magic that does work. It's fine for the Haskell environment to hide impure magic behind a pure interface -- that's what the language is all about.

>I am not positive, but it also would also add the overhead of a
>finitemap lookup across all global variables for every look up.

I'm not positive either, but I don't think it does:

   class InitialValue a where initialValue :: a

   uniqueRef :: (Typeable a, InitialValue a) => IORef a
   uniqueRef = unsafePerformIO (lookupWithRegister (newIORef initialValue))

   ----

   data MyType = ...  deriving Typeable

   instance InitialValue MyType where initialValue = ...

   myEvilTopLevelTWI = (uniqueRef :: IORef MyType)

No, I'm wrong. This can't possibly work, because the dictionaries are thread-local and can be rebound. The library should include another function with the same type as lookupWithRegister, but which uses a per-process dictionary which can't be rebound. Let's call it "oncePerType" since I think it's exactly the same as my oncePerType. Then replace lookupWithRegister by oncePerType in the definition of uniqueRef and it should work. But I've been wrong before. In fact I'm usually wrong in this thread.

-- Ben

_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to