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