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

胡安

Haskell的状态monadState s a迫使我s在整个do块中保持相同的类型但是由于状态monad实际上只是一个函数,如果我将其定义为State i o a = State (i -> (o, a)),该怎么办。returnbind功能看起来完全一样,在标准状态下的单子,但同类型改变:

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的问题,而是关于从技术上讲这是否是单子的问题。或者,如果不是,那将是单子集的某种超集(这样,所有单子集律仍然适用,但具有某些额外功能)?

我发现这对我正在使用的另一种基于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

国家索引单子

class IxMonad m => IxMonadState m where
  iget :: m i i i
  iput :: j -> m i j ()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章