Graham Klyne wrote:

Wouldn't it be easier to simply define "once" as a common Haskell library function?

Depends on the type and the expected semantics. As Adrian Hey already pointed out, (once :: IO a -> IO a) with the obvious semantics is never going to be safe, because it's just not the case that


   x = once (newIORef ())
   y = x

has the same intended meaning as

   x = once (newIORef ())
   y = once (newIORef ())

No amount of compiler-specific magic is going to fix this.

On the other hand, these are perfectly safe:

   once' :: IO a -> IO (IO a)
   oncePerString :: String -> IO a -> IO a
   oncePerType   :: Typeable a => IO a -> IO a

once' seems virtually useless unless you have top-level <-, but the other two don't need it. I'm not sure which would be preferable. I lean toward oncePerString as more flexible and predictable, though it requires a certain discipline on the part of its users.

In any case there would need to be support for different scopes:

   perProcess :: String -> IO a -> IO a
   perThread  :: String -> IO a -> IO a
   perMachine :: String -> IO a -> IO a

I suppose you could add

   perType :: Typeable a => IO a -> IO a

with the stipulation that types in different processes are distinct (which seems like the only safe assumption).

-- Ben

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

Reply via email to