gpt4 book ai didi

haskell - 在 Haskell 的无点函数中理解 `ap`

转载 作者:行者123 更新时间:2023-12-03 20:37:24 27 4
gpt4 key购买 nike

我能够理解 Haskell 中无点函数的基础知识:

addOne x = 1 + x

当我们在等式两边看到 x 时,我们将其简化:
addOne = (+ 1)

令人难以置信的是,在不同部分使用相同参数两次的函数可以无点编写!

让我以 average 为例。函数写为:
average xs = realToFrac (sum xs) / genericLength xs

似乎不可能简化 xs , 但是 http://pointfree.io/出来:
average = ap ((/) . realToFrac . sum) genericLength

这样可行。

据我了解,这表明 average与调用 ap 相同关于两个函数,组成 (/) . realToFrac . sumgenericLength
不幸的是 ap函数对我来说毫无意义,文档 http://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Monad.html#v:ap状态:
ap :: Monad m => m (a -> b) -> m a -> m b

In many situations, the liftM operations can be replaced by uses of ap,
which promotes function application.

return f `ap` x1 `ap` ... `ap` xn

is equivalent to

liftMn f x1 x2 ... xn

但是写:
let average = liftM2 ((/) . realToFrac . sum) genericLength

不起作用,(给出一个很长的类型错误消息,问我会包括它),所以我不明白文档试图说什么。
ap ((/) . realToFrac . sum) genericLength 的表达式如何?工作?你能解释一下 ap比文档更简单?

最佳答案

任何 lambda 项都可以重写为仅使用一组合适的 combinators 的等价项。并且没有 lambda 抽象。此过程称为 abstraciton elimination .在此过程中,您希望从内到外移除 lambda 抽象。所以一步你有λx.M在哪里 M已经没有 lambda 抽象,你想摆脱 x .

  • 如果 Mx , 你替换 λx.xid (id 在组合逻辑中通常用 I 表示)。
  • 如果 M不包含 x ,您将术语替换为 const M (const 在组合逻辑中通常用 K 表示)。
  • 如果 MPQ ,即术语为λx.PQ ,你想“推”x在函数应用程序的两个部分中,以便您可以递归处理这两个部分。这是通过使用 S 来完成的。组合子定义为 λfgx.(fx)(gx) ,也就是需要两个函数,通过x对他们两个,并将结果一起应用。您可以轻松验证 λx.PQ相当于S(λx.P)(λx.Q) ,我们可以递归地处理这两个子项。

    如其他答案中所述,S组合器在 Haskell 中可用 ap (或 <*> )专门用于 reader monad。

  • reader monad 的出现并非偶然:解决替换任务时 λx.M具有等效功能的基本是解除 M :: a致读者 monad r -> a (其实读者应用部分就够了),其中 rx 的类型.如果我们修改上面的过程:
  • 与阅读器 monad 实际相关的唯一情况是 Mx .然后我们“举”xid , 摆脱变量。下面的其他情况只是将表达式提升到应用仿函数的机械应用:
  • 另一种情况λx.M在哪里 M不包含 x ,它只是提升M给读者应用程序,即 pure M .确实,对于 (->) r , pure相当于const .
  • 在最后一种情况下,<*> :: f (a -> b) -> f a -> f b是函数应用程序提升到一个单子(monad)/应用程序。这正是我们所做的:我们举起两个部分 PQ给读者申请,然后使用<*>将它们绑定(bind)在一起。

  • 可以通过添加更多组合子来进一步改进该过程,从而使结果项更短。大多数情况下, combinators B and C are used ,在 Haskell 中对应于函数 (.)flip .再说一次, (.)只是 fmap/ <$>供读者申请。 (我不知道有这样一个用于表达 flip 的内置函数,但对于读者应用程序,它会被视为 f (a -> b) -> a -> f b 的特化。)

    前段时间我写了一篇关于这个的短文: The Monad Reader Issue 17 、Reader Monad 和抽象消除。

    关于haskell - 在 Haskell 的无点函数中理解 `ap`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33454650/

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