是一个状态monad,有两个状态变量类型(进出)还是单子吗?
Haskell的状态单子State sa
迫使我保持相同类型的s
在整个过程中做块。 但是由于状态monad实际上只是一个函数,如果我将它定义为State ioa = 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 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?