【问题标题】:Applicative's Interchange Law申请交换法
【发布时间】:2014-12-04 03:45:29
【问题描述】:

Applicative Programming with Effects,来自 McBride 和 Paterson 的论文,提出了交换律

u <*> pure x = pure (\f -> f x) <*> u

为了理解它,我尝试了以下示例 - 表示左侧。

ghci> Just (+10) <*> pure 5
Just 15

如何使用右侧编写此示例?

另外,如果uf (a -&gt; b),而fApplicative,那么右侧的函数是什么:pure (\f -&gt; f x) ...

【问题讨论】:

  • 直觉一下,因为pure没有效果,在u &lt;*&gt; pure xpure ($ x) &lt;*&gt; u中,唯一有效的部分是u,所以你离开也没关系-或者在没有任何效果的情况下右组合它。

标签: haskell


【解决方案1】:

应该写成

pure (\f -> f 5) <*> Just (+10)

甚至

pure ($ 5) <*> Just (+10)

在这种情况下两者是等价的。从字面上看,您使用pure 包装了一个函数,该函数将另一个函数作为其参数,然后将x 应用于它。您提供f 作为Just 的内容,在本例中为(+10)。当您看到 (\f -&gt; f x) 的 lambda 语法时,它非常字面化,这是用于此定义的 lambda。

【讨论】:

    【解决方案2】:

    该定律的要点是关于Applicative Functor 的指数保存:什么是原点的指数,也是类别图像中的指数。

    请注意ApplicativeFunctor 的实际作用是以下类型的转换:strength :: (f a, f b) -&gt; f (a, b);那么ap&lt;*&gt; 只是fmap eval 在结果之上,或者,完整地写为ap = curry $ fmap (uncurry ($)) . strength

    然后这条定律说,由于在原点g $ x == ($ x) $ g,提升($)x($ x) 应该保持平等。请注意,“正常”Functors 仅在 g 也被提升时才会保留相等性,但 Applicative 函子将为任何类型为 f (a-&gt;b) 的对象保留此相等性,而不是 g。这样,整个类型 f (a-&gt;b) 的行为类似于 f a -&gt; f b,而对于“正常”Functors,它只需要对于原点中的箭头图像的行为类似于 f a -&gt; f b(以使图表通勤并履行承诺Functor)。

    至于代表法律的右手边,你已经被建议从字面上理解,pure ($ 5) &lt;*&gt; Just (+10)

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多