Haskell 如何解读哈斯克尔';s'ap zip tail'表示“\x->;拉链x(尾巴x)`?

Haskell 如何解读哈斯克尔';s'ap zip tail'表示“\x->;拉链x(尾巴x)`?,haskell,Haskell,讨论了如何将Haskell表达式的类型ap-zip-tail转换为\x->zip-x(tail x)。这是很有启发性的,但问题和答案都没有涉及为什么前一个表达式给出与后一个表达式相同的结果,只是它们的类型是等价的。据我所知,它可能意味着\x->zip x(tail(tail x)) 我试着读了好几年的文档,但没有结果。如何阅读ap来理解ap-zip-tail给出的结果与\x->zip-x(tail x)的结果相同?首先,也看一下: ()zip tail x=zip x(tail x)我们可以将x

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

我试着读了好几年的文档,但没有结果。如何阅读
ap
来理解
ap-zip-tail
给出的结果与
\x->zip-x(tail x)
的结果相同?

首先,也看一下:

()zip tail x=zip x(tail x)
我们可以将
x
移到右边,得到
zip tail=\x->zip x(tail x)

您也可以直接使用
ap
实例Monad(->)a
的定义,而无需查看
,但这需要更多的努力

据我所知,这可能意味着\x->zip x(tail(tail x))


仅仅从类型来看,这实际上是不可能的:
m(a->b)->ma->mb
(c->(a->b))->(c->a)->(c->b)
,因此
apf1 f2
不能应用
f2
两次:它有类型
c->a
,并且
f2(f2)
不会进行类型检查。

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

如果你想知道如何找到自己:首先搜索它:你看到你最有可能使用monad实例,那么看看
monad
:看看你是否能在下面找到正确的实例(这里是
monad((->)r)
)-希望有一个到源代码的链接()和瞧(同时查看
ap
:)的源代码)
ap m1 m2          = do { x1 <- m1; x2 <- m2; return (x1 x2) }
-- Since many Applicative instances define (<*>) = ap, we
-- cannot define ap = (<*>)
instance Applicative ((->) a) where
    pure = const
    (<*>) f g x = f x (g x)