是一个状态monad,有两个状态变量类型(进出)还是单子吗?

Haskell的状态单子State sa迫使我保持相同类型的s在整个过程中做块。 但是由于状态monad实际上只是一个函数,如果我将它定义为State ioa = 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 io绑定类型(只有a可以改变)。 但是这个问题不是关于Haskell,而是关于这在技术上是否是monad。 或者,如果不是,它会是某种monad的超集(这样所有monad法则仍然适用,但有一些额外的特征)?

这是我发现在我正在工作的另一种语言中是有用的,它基于lambda微积分,所以我使用Haskell作为参考。 我只是不希望这件事稍后会在我希望单子法适用的地方打破。


你正在寻找的是一个索引Monad。 参见例如category-extras的定义:

索引Monad的定义:

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

国家索引Monad:

class IxMonad m => IxMonadState m where
  iget :: m i i i
  iput :: j -> m i j ()
链接地址: http://www.djcxy.com/p/42917.html

上一篇: Is a state monad with two state variable types (in and out) still a monad?

下一篇: Why do we need monads?