【问题标题】:Scala,Cats, usage of `ap`Scala,Cats,`ap`的用法
【发布时间】:2021-02-25 13:41:39
【问题描述】:

我将通过 https://www.scala-exercises.org/ 为 Cats 服务。我想我明白Apply.ap 是什么意思。但我看不到它的任何用法。

有什么区别:

Apply[Option].map(Some(1))(intToString)

Apply[Option].ap(Some(intToString))(Some(1))

有人可以解释更多或指出更多解释吗?

【问题讨论】:

  • 说实话,我从来没有直接使用过ap。相反,我使用 tupledmapNtraverse 之类的东西隐式使用它。
  • 谢谢这是我的理解“不在用户代码中”。 Luis,还有apNmapN 一样,但我猜答案是一样的。
  • ApplyApplicative 的一个特殊类型类,它也是一个 Functor。 Applicative 提供ap 操作。它与 Functor 的 map 非常相似,但参数中的函数已经在 F[_] 域中。在很多情况下,例如 Monoid,它们可以互换使用,但有一些例外。
  • 在 FP 中,ap 更常用作与形状为ap(map)map 的组合,也就是众所周知的liftA2。请注意ap 是一个非常基础的操作,您应该知道何时使用它而不是flatMap

标签: scala functional-programming functor scala-cats applicative


【解决方案1】:

没有区别

Apply[Option].map(Some(1))(intToString)

Apply[Option].ap(Some(intToString))(Some(1))

两者都是Some("1")

但是mapap之间有很大的区别。

map 来自于类型类Functor 并且有一个签名

def map[A, B](fa: F[A])(f: A => B): F[B]

ap 来自于类型类Apply 并且有一个签名

def ap[A, B](ff: F[A => B])(fa: F[A]): F[B]

所以map函数 A => B 应用于上下文F[A] 中的值,而ap 应用函数 F[A => B] in上下文 到上下文F[A] 中的值。

例如

Apply[List].map(List(1, 2))(intToString)

List("1", "2")

Apply[List].ap(List(intToString, (i: Int) => intToString(i) + "a"))(List(1, 2))

List("1", "2", "1a", "2a")

Apply[Option].map(fx)(f) 只能在 fxNone 时为 None,而当 fxNoneffNone 时,Apply[Option].ap(ff)(fx) 可以为 None

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 2019-04-09
    • 2019-08-17
    • 1970-01-01
    • 2018-10-08
    • 2019-12-24
    • 2022-01-22
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多