了解类型类声明中的类型参数

时间:2014-03-03 14:39:12

标签: haskell monads typeclass

我很难理解状态monad中类型参数的含义,以及其他mtl monad的含义。就我所理解的那样,当我撰写国家单子时,就像State String Int一样,我真正拥有的是StateT String Identity Int。对于get类型类的方法MonadState,它返回m s,' m'是什么?在这种情况下?它是Identity monad,Identity Int吗?在这种情况下,是' s'它表示状态的类型是' m&#39 ;?的参数。

谢谢,我显然在理解Haskell的类型系统时遇到了一些麻烦。

2 个答案:

答案 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 ~ Stringa ~ Int,因此get的类型为Identity String,类型为put }是Identity ()