# FunDeps & Monad transformers

**Jose Emilio Labra Gayo
**
labra@lsi.uniovi.es

*Mon, 26 Feb 2001 12:40:32 +0100*

I was using monad transformers with definitions like the following:
>* -- class Monad m => StateMonad s m
*>* -- where update :: (s -> s) -> m s
*
However, if I try to define
>* test :: ( StateMonad s m, Num s ) => m ()
*>* test = do { update (+1) ; return () }
*
I obtain
ERROR ... - Ambiguous type signature in type declaration
*** ambiguous type : (StateMonad a b, Num a) => b ()
*** assigned to : test
I thought that functional dependencies could be useful
to solve those typings. So I wrote:
>* class Monad m => StateMonad s m | m -> s
*>* where update :: (s -> s) -> m s
*
And now, the 'test' function loads with Hugs.
However, when I try to declare the following instances (which previously
worked ok):
>* class (Monad m, Monad (t m)) => MonadT t m where
*>* lift :: m a -> t m a
*
>* newtype StateT s m v = S (s -> m (v,s))
*
>* instance ( StateMonad s m
*>* , MonadT t m) => StateMonad s (t m)
*>* where update = lift . update
*
>* instance Monad m => StateMonad s (StateT s m)
*>* where update f = S (\s -> return (s, f s))
*
I obtain the following error
ERROR ... - Instances are not consistent with dependencies
*** This instance : StateMonad a (StateT a b)
*** Conflicts with : StateMonad a (b c)
*** For class : StateMonad a b
*** Under dependency : b -> a
Is it possible to define those declarations?
Best regards, Jose Labra
http://lsi.uniovi.es/~labra