Closed boboyada closed 6 years ago
与单子没有什么必然关系,只是有时候反复的书写满足某种模式的函数组合太麻烦了,所以抽象出单子以及相应的return
、(>>=)
来简化书写。
与副作用对应的主作用就是单子组合是的时候单子m a
里包裹的值a
的传递咯,举个State
的例子:
...
a <- modify (+1) -- 仅仅改变了单子上下文
return (a+1) -- 改变了单子里包裹的值
你不妨把单子的上下文理解为一个额外的“通道”(在Arrow
里也是这么抽象的),除了这个额外通道携带的信息之外,单子里包裹的值也是每次组合必须传递下去的。这个和基本的函数组合没啥区别:
unlines . map reverse . lines $ ... -- 看到这里的数据流动了吗?
(\ a -> return (a+1) ) <=< modify (+1) $ ... -- 看到这里的数据以及State携带的s的流动了吗?