Jua*_*uan 5 monads state-monad category-theory
Haskell的状态monad State s a
迫使我s
在整个do块中保持相同的类型。但是由于状态monad实际上只是一个函数,如果将其定义为State i o a = State (i -> (o, a))
?,该怎么办。该return
和bind
功能看起来完全一样,在标准状态下的单子,但同类型改变:
return :: a -> State st st a
bind :: (State i o a) -> (a -> (State o o' b)) -> (State i o' b)
Run Code Online (Sandbox Code Playgroud)
我认为Monad
使用此定义无法在Haskell中实现,因为它期望State i o
bind中只有一个类型(只能a
更改)。但这不是关于Haskell的问题,而是关于从技术上讲这是否是单子的问题。或者,如果不是,那将是单子集的某种超集(这样,所有单子集律仍然适用,但具有某些额外功能)?
我发现这对我正在使用的另一种基于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
Run Code Online (Sandbox Code Playgroud)
国家索引 Monad:
class IxMonad m => IxMonadState m where
iget :: m i i i
iput :: j -> m i j ()
Run Code Online (Sandbox Code Playgroud)