winterland1989 / magic-haskell

魔力haskell官方网站
293 stars 28 forks source link

monad与副作用 #38

Closed boboyada closed 6 years ago

boboyada commented 7 years ago
    单子的作用,我能理解到的一点,就是连续运算,并形成前后依赖,所以适合做顺序式/命令式编程
     纯函数与不纯函数,以及副作用也大致能理解些。可它们与单子有什么必然关系?

     网上还有说什么,单子有伴随作用。那么什么是伴随作用?那与之对应的主作用是谁?请举个例子
winterland1989 commented 7 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的流动了吗?