
29 Apr
2006
29 Apr
'06
2:07 p.m.
In article
This is one of the motivating examples for associated types. You would define Ref as,
class (Monad m) => Ref m where data Ref m a
newRef :: a -> m (Ref m a) readRef :: Ref m a -> m a writeRef :: Ref m a -> a -> m ()
This declares a one-to-one relation between "m" and "Ref m". That is, you are guaranteed that Ref (ST s1) == Ref (ST s2) iff s1 == s2.
You can also do it without associated types or MPTCs: data Ref m a = MkRef { readRef :: m a writeRef :: a -> m () } class (Monad m) => Ref m where newRef :: a -> m (Ref m a) This is also more general. -- Ashley Yakeley, Seattle WA WWEWDD? http://www.cs.utexas.edu/users/EWD/