什么是应用效果?

sev*_*evo 6 haskell applicative

有效应用程序设计效果概念的含义是什么?

例如,下面表达式的哪些部分是效果

[(+1)] <*> [2,3]
Just (+1) <*> Nothing
Run Code Online (Sandbox Code Playgroud)

Ion*_*tan 7

在FP的世界里,一个效果是任何类型的构造,例如Maybe,[],IO等效应不被有副作用的混淆.直觉上,效果是您正在计算的值的附加属性.Maybe Int表示您的程序计算Int具有失败效果[Int]的程序,或意味着您的程序计算Int但具有非确定性效果(非确定性结果在此建模为可能结果列表).

从这里走出去,我们有术语可适用的效果一元的影响,这意味着上述效果都ApplicativeMonad实例.

我找不到任何这方面的权威信息,这正是我根据自己的经验收集到的信息.


Wil*_*ess 6

很多混乱是由于不幸的名字选择引起的,这在Haskell中很常见(想想" return更好地命名" emit").

pure x不是纯粹的,它是x纯粹的,pure只是注入.它被设想用于pure f <*> a <*> b <*> ...模式,让我们有效地应用纯粹的功能f.

[]应用性让我们"不确定性"应用(<*>不是$)一个非确定性值(不是两个值,在你的例子),以非确定性的功能; 所述非确定性是效果.

在list applicative中,[(+1), (+2)]是一个非确定性函数,可能会将值递增1,也可能会将其递增2. [3,4,5]是一个非确定性值,其中列出了可能的值.正如我们运用正常的实体(+1)3正常,因为(+1) $ 3,所以我们可以运用非确定性值不确定性,如[(+1)] <*> [3][(+1),(+2)] <*> [3,4,5].

并且失败Maybe可能性就是影响.


luq*_*qui 5

我们可以说类型的效果f a是任何不能写成的pure x地方x :: a.

[]应用中pure x = [x],所以[(+1)] = pure (+1)可能不应该被视为效果.同样在Maybe应用中pure = Just,所以Just (+1)不是效果.

这使得[2,3]Nothing作为您的各例的影响.从[]表示不确定性计算的角度来看,这是直观的意义:[2,3]非确定性地选择2到3之间; 以及Maybe表示计算Nothing失败的视角:计算失败.

我使用的定义是一种效果(也许是"副作用"将是一个更好的词)是一种无法写成的东西,因为pure x它只是使你的问题变得精确,并不代表任何形式的共识或标准定义. Ness的答案会给出一个不同的视角,它会pure从纯值生成一个有效的计算,它有一个很好的数学环 - 即这个定义可能更容易在精确设置中使用.

  • `pure x` 不是纯的,它是 `x` 是纯的。根据定义,“纯 x”始终是有效的“x”。`pure (+1) :: [(Num a)=&gt;a-&gt;a]` 是一个有效的增量函数 - 一个*非确定性*增量函数。隐含的不确定性*是*效果。 (2认同)