I raise you: class (Monad m) => Ref m c | c -> m where new :: a -> m (c a) get :: c a -> m a peek :: c a -> m a set :: c a -> a -> m () modify :: c a -> (a -> a) -> m a modify_ :: c a -> (a -> a) -> m () modifyM :: c a -> (a -> m a) -> m a modifyM_ :: c a -> (a -> m a) -> m () Bulat Ziganshin wrote:
Hello Lyle,
Thursday, September 15, 2005, 10:50:30 PM, you wrote:
z := *x + *y -- translated to { x' <- readIORef x; y' <- readIORef y; writeIORef z (x'+y') }
LK> Right, I realize my suggestion is the same as Ben's. I just prefer a LK> more succinct notation, like special brackets instead of a keyword. I LK> like your idea about IORefs. I think it should work as well for LK> STRefs... perhaps it needs to belong to a type class, in a way?
of course
class Ref c a where new :: a -> IO (c a) get :: c a -> IO a set :: c a -> a -> IO ()