我很难理解状态monad中类型参数的含义,以及其他mtl monad的含义。就我所理解的那样,当我撰写国家单子时,就像State String Int
一样,我真正拥有的是StateT String Identity Int
。对于get
类型类的方法MonadState
,它返回m s
,' m'是什么?在这种情况下?它是Identity monad,Identity Int吗?在这种情况下,是' s'它表示状态的类型是' m&#39 ;?的参数。
谢谢,我显然在理解Haskell的类型系统时遇到了一些麻烦。
答案 0 :(得分:6)
这取决于您使用的实例 - 这是类型类的全部要点!
class MonadState s m where
get :: m s
如果只是State
,那就是你所在的monad:
instance MonadState String (State String) where
get :: State String String
......这是
的缩写instance MonadState String (StateT String Identity) where
get :: (StateT String Identity) String
OTOH,也可能是
instance MonadState Int (StateT Int IO) where
get :: StateT Int IO Int
答案 1 :(得分:3)
如果我们看一下StateT
的定义:
class (Monad m) => MonadState s m | m -> s where
get :: m s
put :: s -> m ()
其中StateT
的实例定义为
instance (Monad m) => MonadState s (StateT s m) where
get = StateT.get
put = StateT.put
然后我们说
type State s a = StateT s Identity a
然后我们知道在这种情况下,m ~ Identity
。对于State String Int
的情况,我们也可以推断出s ~ String
和a ~ Int
,因此get
的类型为Identity String
,类型为put
}是Identity ()
。