the MPTC Dilemma (please solve)
Manuel M T Chakravarty
chak at cse.unsw.edu.au
Sun Mar 19 21:31:36 EST 2006
Bulat Ziganshin:
> 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?
Bidirectional FDs correspond to associated data types. I am not sure
what you try to achieve with your Ref2 example. The dependency of r on
a seems to be surious as you don't instantiate a in any of your instance
declarations.
> 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)
Yes, absolutely.
Manuel
More information about the Haskell-prime
mailing list