[英]Haskell (>>) operator
runState (modify (+1) >> modify (+1)) 0
有人可以解释上面的代码如何产生((),2)? 给定(>>) :: Monad m => ma -> mb -> mb
我会认为第一个“修改(+1)”将被删除导致((),1)。
>>
运算符不是flip const
,即使它具有类似的类型签名。 如果查看默认实现,可以看到它实际上在第一个参数上调用>>=
:
a >> b = a >>= \_ -> b
出于这个原因,您可以将>>
视为对其“副作用”运行monadic动作,但丢弃结果 。 如果你内联上面的>>
定义代替你的例子,你得到的结果就变得非常清楚了:
runState (modify (+1) >>= \_ -> modify (+1)) 0
这显然会在状态monad的上下文中运行modify (+1)
两次,因此结果状态将是2
,而不是1
。
关于State s
monad你可以:
newtype State s a = State { runState :: s -> (a, s) }
让我们看看如何为这个monad实现operator(>>):
(State f) >> (State g) = State (g . snd . f)
如何修改工作:
modify f = State $ \s -> ((), f s)
所以一起撰写:
modify (+1) >> modify (+1) => (State $ \s -> ((), s + 1)) >> ((State $ \s -> ((), s + 1)) => State (\s -> ((), (s + 1) + 1))
然后:
runState (State (\s -> ((), (s + 1) + 1))) 0 => (\s -> ((), (s + 1) + 1)) 0 => ((), (0 + 1) + 1) => ((), 2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.