首页 文章

状态monad是否具有两个状态变量类型(in和out)仍然是monad?

提问于
浏览
5

Haskell的状态monad State s a 迫使我在整个do块期间保持相同类型的 s . 但是因为状态monad实际上只是一个函数,如果我将它定义为 State i o a = State (i -> (o, a)) 怎么办? returnbind 函数看起来与标准状态monad中的函数完全相同,但是类型已更改:

return :: a -> State st st a
bind :: (State i o a) -> (a -> (State o o' b)) -> (State i o' b)

我不认为可以使用此定义在Haskell中实现 Monad ,因为它期望绑定中有一个 State i o 类型(只有 a 可以更改) . 但这个问题不是关于Haskell,而是关于这在技术上是否是一个monad . 或者如果没有,它会成为monad的某种超集(这样所有的monad法律仍适用但有一些额外的功能)?

这是我发现在我正在研究的另一种语言中有用的东西,它基于lambda演算,所以我使用Haskell作为参考 . 我只是不想在以后我希望monad法律适用的地方打破其他东西 .

1 回答

  • 4

    您正在寻找的是索引的Monad . 参见例如 category-extras 中的定义:

    definition of an indexed Monad

    class IxApplicative m => IxMonad m where
      ibind :: (a -> m j k b) -> m i j a -> m i k b
    

    State indexed Monad

    class IxMonad m => IxMonadState m where
      iget :: m i i i
      iput :: j -> m i j ()
    

相关问题