具有两种状态变量类型(in 和 out)的状态 monad 仍然是 monad 吗?
Is a state monad with two state variable types (in and out) still a monad?
Haskell 的状态 monad State s a
迫使我在整个 do 块中保持相同类型的 s
。但是由于状态 monad 实际上只是一个函数,如果我将它定义为 State i o a = State (i -> (o, a))
会怎样呢?。 return
和 bind
函数看起来与标准状态 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 法则仍然适用,但有一些额外的功能)?
我发现这对我正在研究的另一种语言很有用,它基于 lambda 演算,所以我使用 Haskell 作为参考。我只是不希望这会在我希望 monad 法则适用的地方破坏其他东西。
您正在寻找的是 indexed 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
class IxMonad m => IxMonadState m where
iget :: m i i i
iput :: j -> m i j ()
Haskell 的状态 monad State s a
迫使我在整个 do 块中保持相同类型的 s
。但是由于状态 monad 实际上只是一个函数,如果我将它定义为 State i o a = State (i -> (o, a))
会怎样呢?。 return
和 bind
函数看起来与标准状态 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 法则仍然适用,但有一些额外的功能)?
我发现这对我正在研究的另一种语言很有用,它基于 lambda 演算,所以我使用 Haskell 作为参考。我只是不希望这会在我希望 monad 法则适用的地方破坏其他东西。
您正在寻找的是 indexed 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
class IxMonad m => IxMonadState m where
iget :: m i i i
iput :: j -> m i j ()