Scala、Cats、`ap` 的用法

ger*_*s.b 2 functional-programming scala functor applicative scala-cats

我将通过https://www.scala-exercises.org/获取Cats。我想我明白是什么意思了Apply.ap。但我看不到它有任何用途。

有什么区别:

Apply[Option].map(Some(1))(intToString)
Run Code Online (Sandbox Code Playgroud)

Apply[Option].ap(Some(intToString))(Some(1))
Run Code Online (Sandbox Code Playgroud)

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

Dmy*_*tin 5

之间没有区别

Apply[Option].map(Some(1))(intToString)
Run Code Online (Sandbox Code Playgroud)

Apply[Option].ap(Some(intToString))(Some(1))
Run Code Online (Sandbox Code Playgroud)

两者都是Some("1")

map但和之间有很大的区别ap

map来自类型类Functor并具有签名

def map[A, B](fa: F[A])(f: A => B): F[B]
Run Code Online (Sandbox Code Playgroud)

ap来自类型类Apply并具有签名

def ap[A, B](ff: F[A => B])(fa: F[A]): F[B]
Run Code Online (Sandbox Code Playgroud)

因此,map函数 A => B应用于上下文中的值F[A],同时ap上下文中的函数 应用于上下文中的值。F[A => B] F[A]

例如

Apply[List].map(List(1, 2))(intToString)
Run Code Online (Sandbox Code Playgroud)

List("1", "2")同时

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

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

Apply[Option].map(fx)(f)None仅当fxis时才可以为NonewhileApply[Option].ap(ff)(fx)可以为is或isNone时。fxNoneffNone