繁体   English   中英

Haskell(>>)运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM