【发布时间】:2015-11-29 04:50:19
【问题描述】:
Haskell 的状态单子 State s a 迫使我在整个 do 块中保持相同类型的 s。但是由于 state 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 作为参考。我只是不希望这会在我希望单子定律适用的地方破坏其他东西。
【问题讨论】:
标签: monads state-monad category-theory