I have found what is either a problem in ghc/ghci or a problem in my
understanding...
either way if someone could point out whats wrong I would be very grateful.

I am experimenting with monad-transformers, and am tying to define a class
to allow a
run function to be overloaded. The program layers two monads on top of the
IO monad,
a state monad-transformer, and an error monad-transformer.

If I define a set of untyped functions:

unFC (FC x) = x -- run a forward composed monad
unBC (BC x) = x -- run a backward composed monad
unSTM (STM x) = x       -- run a monad composed with a State monad-transformer

I then used ghci to derive the type for these functions...

unFC :: forall m n a . (Monad m,Monad n) => FComp m n a -> n (m a)
unBC :: forall m n a . (Monad m,Monad n) => BComp m n a -> m (n a)
unSTM :: forall s m a . (Monad m) => StateT s m a -> s -> m (a,s)

the program still passes type checking with these types added.
next I defined a type class:

class Composed c where
        run :: c

and some instances:

instance (Monad m,Monad n) => Composed (FComp m n a -> n (m a))
        run = unFC

instance (Monad m,Monad n) => Composed (BComp m n a -> m (n a))
        run = unBC

instance (Monad m) => Composed (StateT s m a -> s -> m (a,s))
        run = unSTM

However when I compile now, replacing:
   unFC (unSTM test (0::Int))
with
   run (run test (0::Int))

I now get an error: no instances for (Composed (t -> IO t1),Composed (StateT
Int ErrorIO Int  -> Int -> t))


        Regards,
        Keean.

_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to