Applicatives 运行 什么时候发挥作用?

When do Applicatives run their effects?

下,我们经常谈到 Applicative 运行 在将函子中的函数应用到函子中的值之前的副作用.

此外,danidiaz used this fact to show that Arrow is not equivalent to Applicative in this answer under "Arrows are exactly equivalent to applicative functors?" question

这个 属性 是如何形式化的?

对于Applicative,这可以通过参数化来证明。考虑...

(&*&) :: Applicative f => f a -> f b -> f (a, b)

... 与 the monoidal presentation of Applicative 中的 (<*>) 对应。限于函数,(&*&) 的自由定理是:

fmap g u &*& fmap h v = fmap (bimap g h) (u &*& v)

(自由定理实际上比那个更通用,因为它允许不是函数的关系扮演 gh 的角色。)

自由定理意味着如果我们改变uv的函子中的值,(&*&)的结果将只受其相应值的影响-in-the-functor 以同样的方式改变。换句话说,就 (&*&) 而言,函子中的值对应用效果没有影响,这正是您打算建立的。