Is there anyone who knows why "atomicModifyIORef" has type:

 IORef a -> (a -> (a, b)) -> IO b              (1)

Instead of:

 IORef a -> (a -> a) -> IO a                   (2)

It seems to me that returning the old value is always good enough right? Here is an implementation of "atomicModifyIORef" with the current type in terms of a function "proposedModifyIORef" with type (2).

atomicModifyIORef :: IORef a -> (a -> (a,b)) -> IO b
atomicModifyIORef ref f
  = do old <- proposedModifyIORef ref (fst . f)
       return (snd (f old))

It makes much more sense to me to have type (2), the scope for errors and code duplication is much lower in my opinion.

All the best,

FFI mailing list

Reply via email to