the MPTC Dilemma (please solve)

Bulat Ziganshin bulat.ziganshin at
Sun Mar 19 15:18:54 EST 2006

Hello Manuel,

Sunday, March 19, 2006, 7:25:44 PM, you wrote:

>> i had a class which defines "default" reference type for monads:
>> class Ref m r | m->r where

to be exact,

class Ref m r | m->r, r->m where
>>   newRef :: a -> m (r a)
>>   readRef :: r a -> m a
>>   writeRef :: r a -> a -> m ()

or even worser:

class Ref2 m r a | m a->r, r->m
instance (Unboxed a) => Ref2 IO IOURef a
instance (!Unboxed a) => Ref2 IO IORef a
instance (Unboxed a) => Ref2 (ST s) (STURef s) a
instance (!Unboxed a) => Ref2 (ST s) (STRef s) a

MMTC> My statement remains:  Why use a relational notation if you can have a
MMTC> functional one?

how about these examples?

MMTC>   class Monad m => RefMonad m where
MMTC>     type Ref m :: * -> *

can i use `Ref` as type function? for example:

data StrBuffer m = StrBuffer (Ref m Int)
                             (Ref m String)
Best regards,
 Bulat                            mailto:Bulat.Ziganshin at

More information about the Haskell-prime mailing list