【发布时间】:2016-01-27 23:09:40
【问题描述】:
我一遍又一遍地阅读有效这个词,但我仍然无法明确定义它的含义。我假设正确的上下文是有效的计算,但我也看到了有效的术语values)
我曾经认为有效意味着有副作用。但是在 Haskell 中没有副作用(在某种程度上 IO 除外)。仍然到处都有有效的计算。
然后我读到 monad 用于创建有效的计算。我可以在State Monad 的上下文中理解这一点。但我看不到 Maybe monad 的任何副作用。一般来说,在我看来,包装类似函数的东西的 Monad 比只包装一个值的 Monad 更容易被视为产生副作用。
当谈到 Applicative 函子时,我更加迷茫了。我总是将应用函子视为map 具有多个参数的函数的一种方式。我在这里看不到任何副作用。或者有效果的和有效果的有区别吗?
【问题讨论】:
-
也许有用:slpopejoy.github.io/posts/Effectful01.html 他将 effectful 定义为: 1. 实际副作用 (IO) 2. 看起来像副作用的东西(状态、作家等) .) 3. 在函数调用中持续存在的上下文(Reader、State 等) 4. 非本地控制流(Maybe、Either)。
-
大多数 monad 是根据纯计算定义的,但从程序员的角度来看,通常将
State s a视为可以读取/写入状态s的命令式子例程有副作用,最后产生一个a。就算是纯的,有时候假装不是也很方便。在主题上,我想说的是 effectful 和 with effects 的意思是一样的,即使它们有时被广泛地应用于包装在任何 monad/applicative 中的值,即使它们没有模拟副作用。 -
我在关于Traversables 的问题的评论中找到了一个很好的答案。有人问这个问题“‘效果’这个词是什么意思?” @missingfaktor 给出了一个非常好的答案,简而言之:“这意味着 Functor 的结构信息,即非参数化的部分”。 Here 是完整的答案。
标签: haskell monads applicative side-effects