I applaud the simplification. Getting rid of multi parameter classes and functional dependencies is a Good Thing. Unfortunately I am worried about the extensibility of the new scheme. You replace two types, IORef a and STRef s a by a single type:
data Ref m a -- References in monad m, values of type a
I suppose the implementation of the two original types is actually the same, so that they can be merged. The m is a phantom type argument. How, however, can I now define an instance of RefMonad for my own Monad?
class RefMonad m where newRef :: a -> m (Ref m a) readRef :: Ref m a -> m a writeRef :: Ref m a -> a -> m ()
If I remember Koen Claessen correctly, it is actually impossible to define your own references in Haskell, even inefficient ones, without builtin references. Nonetheless, I might want for example to define a GUI monad, with an embedded IO monad. data GUI a = GUI (State -> IO (State,a)) Then I would like to define the newRef, readRef, writeRef operations on Ref GUI a in terms of the operations on Ref IO a. But I don't see any way to do that. Probably some kind of type conversion between various Ref m a types would be needed; the existence of such a type conversion function probably leads to other nasty problems... Any solutions? -- OLAF CHITIL, Dept. of Computer Science, The University of York, York YO10 5DD, UK. URL: http://www.cs.york.ac.uk/~olaf/ Tel: +44 1904 434756; Fax: +44 1904 432767