monads - 具有两种状态变量类型(输入和输出)的状态单子(monad)仍然是单子(monad)吗?

标签 monads state-monad category-theory

Haskell 的状态单子(monad) State s a迫使我保持​​相同类型的 s在整个做 block 期间。但是由于 state 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)

我认为不可能实现 Monad在 Haskell 中使用这个定义,因为它需要一个 State i o输入 bind(只有 a 可以更改)。但是这个问题不是关于 Haskell 而是关于这在技术上是否是一个单子(monad)。或者如果不是,它会是某种单子(monad)的超集(这样所有的单子(monad)定律仍然适用,但有一些额外的功能)?

这是我发现在我正在研究的另一种语言中有用的东西,它基于 lambda 演算,所以我使用 Haskell 作为引用。我只是不希望这会在我希望单子(monad)定律适用的地方破坏其他东西。

最佳答案

您正在寻找的是一个索引的 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 ()

关于monads - 具有两种状态变量类型(输入和输出)的状态单子(monad)仍然是单子(monad)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32374159/

相关文章:

haskell - 在 Haskell 中,如何区分一元函数定义中的可变引用与常规变量

haskell - 来自 GHC.IO 的 `ioToST` 和 `unsafeIOToST` 有什么区别

scala - 映射和携带状态的正确 monad 或序列理解是什么?

haskell - 一旦我有了 F-Algebra,我可以用它来定义 Foldable 和 Traversable 吗?

haskell - 这种请求-响应类型是否有标准抽象?

scala - 将 monad 组合成元组运算符 scalaz

python - 也许 Python 中的 monad 带有方法链

haskell - GADT 的索引初始代数

haskell - 两个非仿函数可以组成一个仿函数吗?

haskell - ApplicativeDo 不使用测序