【问题标题】:How does one read Haskell's `ap zip tail` to mean `\x -> zip x (tail x)`?人们如何阅读 Haskell 的 `ap zip tail` 来表示 `\x -> zip x (tail x)`?
【发布时间】:2015-03-31 05:40:05
【问题描述】:

A previous question 讨论了如何将 Haskell 表达式 ap zip tail 的类型转换为 \x -> zip x (tail x) 的类型。这很有启发性,但是那里的问题和答案都没有涉及 why 前一个表达式给出与后一个表达式相同的结果,只是它们的类型是等价的。据我所知,这可能意味着\x -> zip x (tail (tail x))

我尝试阅读ap 的文档,但一无所获。如何阅读 ap 以了解 ap zip tail 给出与 \x -> zip x (tail x) 相同的结果?

【问题讨论】:

标签: haskell


【解决方案1】:

首先,看看source

ap m1 m2          = do { x1 <- m1; x2 <- m2; return (x1 x2) }
-- Since many Applicative instances define (<*>) = ap, we
-- cannot define ap = (<*>)

你知道(从上一个问题)我们感兴趣的 monad 是 (-&gt;) [a]。既然我们从那条评论中知道ap(&lt;*&gt;) 相同,那么接下来我们看看

instance Applicative ((->) a) where
    pure = const
    (<*>) f g x = f x (g x)

(&lt;*&gt;) zip tail x = zip x (tail x) 我们可以将x 向右移动得到zip &lt;*&gt; tail = \x -&gt; zip x (tail x)

您也可以直接使用apinstance Monad (-&gt;) a 的定义,而无需查看&lt;*&gt;,但这需要更多的努力。

据我所知,它可能意味着 \x -> zip x (tail (tail x)) 代替。

实际上是不可能的:m (a -&gt; b) -&gt; m a -&gt; m b 在这个 monad 中是 (c -&gt; (a -&gt; b)) -&gt; (c -&gt; a) -&gt; (c -&gt; b),所以 ap f1 f2 不能应用 f2 两次:它有类型 c -&gt; af2 (f2 &lt;anything&gt;) 不会进行类型检查。

【讨论】:

    【解决方案2】:

    this answer 的第二部分解释了它。请记住,&lt;*&gt;ap 相同,但只是作为中缀运算符,并且作为Applicative 的一部分,而不是它的子类Monad,因为它只需要Applicative 就可以工作。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2010-12-24
      • 2021-03-04
      • 2010-12-04
      相关资源
      最近更新 更多