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

时间:2015-09-03 11:17:19

标签: monads state-monad category-theory

Haskell的状态monad State s a迫使我在整个阻止期间保持相同类型的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 个答案:

答案 0 :(得分: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 ()