On Tue, Nov 22, 2005 at 05:26:00PM -0700, Fan Wu wrote:
type NDS a = StateT ProblemState [] a
getVar :: Var - NDS (Maybe Value)
getVar v = do vs - gets vars
return $ lookup v vs
What puzzles me is that, I think the Monad of the do block shall be
the NDS (Maybe Value) in declaration, but the type of gets is
gets :: (MonadState s m) = (s - a) - m a
So gets returns a Monad of type m ([] is this case), which seems to
be different from NDS (Maybe Value), but GHC does not complain about
it.
If I comment out the type declaration of getVar :: Var - NDS (Maybe
Value) and let GHC interpret the type, then the type of getVar is
like:
getVar :: (MonadState ProblemState m) = Var - m (Maybe Value)
So does it mean StateT ProblemState m and the m as in MonadState
ProblemState m is the same thing?
No! Check out the instance:
instance (Monad m) = MonadState s (StateT s m) where ...
So you can see that the m in MonadState ProblemState m is actually
StateT ProblemState m' where m' is the inner monad, [] in your case.
So a correct type for gets as you use it is
gets :: (ProblemState - a) - MonadState ProblemState [] a
Andrew
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe