什么是应用程序构建器

What is Applicative Builder

我是 scala 和功能新手,正在尝试学习应用程序。

val o1 = Some(1)
val o2 = Some(2)
val o3 = Some(3)
val result = (o1 |@| o2 |@| o3) {_ + _ + _}

有一本关于 Applicatives and Functors 的好书 here

根据这篇博客,

Operator |@| is the product operation

combining your applicatives into a product by using |@| results in an ApplicativeBuilder which takes a function to perform on the product (since product + map is a very common use case)

我觉得很难理解博客中的以上两句话。 任何带有 scala 代码的示例都有助于理解这一点。

我认为 post 的关键在于这句话:

Hey, so you got your function wrapped into a bit of a context, huh? Not to worry, I know how to apply those kind of wrapped functions

Applicative 提供了一种将包装在上下文中的函数应用于其他包装值的方法。

|@| 和基础类型 ApplicativeBuilder 只是 scalazs 通过 DSL 构建这些应用程序的方式。

来自文档(强调我的):

Whereas a scalaz.Functor allows application of a pure function to a value in a context, an Applicative also allows application of a function in a context to a value in a context (ap)


Operator |@| is the product operation

通过 "product operation" OP 意味着它是采用两个值并将它们包装在 ApplicativeBuilder.

中的操作

|@| 是一种方法,当被调用时,returns 是 ApplicativeBuilder:

的一个实例
final def |@|[B](fb: F[B]) = new ApplicativeBuilder[F, A, B] {
  val a: F[A] = self
  val b: F[B] = fb
}

其中 F 是定义了 Apply 实例的一阶类型:

implicit val F: Apply[F]

其中 Apply 只是一个没有 point 方法的 Applicative

combining your applicatives into a product by using |@| results in an ApplicativeBuilder which takes a function to perform on the product (since product + map is a very common use case)

如果你举个例子,把它简化一点 Option[Int]s:

import scalaz.Scalaz._

val o1 = 1.some
val o2 = 1.some
val result: ApplicativeBuilder[Option, Int, Int] = o1 |@| o2
val finalRes: Option[Int] = result.apply(_ + _)

我们:

  1. |@| 应用于 Option[Int] 的两个实例并取回 ApplicativeBuilder[Option, Int, Int]Option 这是我们的 F,它有一个 Apply.
  2. 的实例
  3. 取回构建器实例后,我们调用它的 apply 方法。我们为它提供一个形状为 Int -> Int 的函数,它返回一个 Option[Int],这意味着我们仍在上下文中,但已将操作应用于我们的值。