gpt4 book ai didi

haskell - 如何读取 Haskell 的 `ap zip tail` 表示 `\x -> zip x (tail x)` ?

转载 作者:行者123 更新时间:2023-12-03 22:15:17 25 4
gpt4 key购买 nike

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

我尝试阅读 ap 的文档但无处可去。怎么读ap了解 ap zip tail给出与 \x -> zip x (tail x) 相同的结果?

最佳答案

首先看source还有:

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

你知道(从上一个问题)我们感兴趣的 monad 是 (->) [a] .由于我们从该评论中得知 ap(<*>) 相同,接下来我们看
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
(<*>) zip tail x = zip x (tail x)我们可以搬家 x向右走 zip <*> tail = \x -> zip x (tail x) .

您也可以使用 ap 的定义和 instance Monad (->) a直接不看 <*> ,但这需要更多的努力。

For all I know it could've meant \x -> zip x (tail (tail x)) instead.



这实际上是不可能的,仅从类型来看: m (a -> b) -> m a -> m b(c -> (a -> b)) -> (c -> a) -> (c -> b)在这个 monad 中,所以 ap f1 f2不能申请 f2两次:它的类型是 c -> af2 (f2 <anything>)不会打字。

关于haskell - 如何读取 Haskell 的 `ap zip tail` 表示 `\x -> zip x (tail x)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com