什么是Applicative Builder

mog*_*gli 5 functional-programming scala applicative

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

val o1 = Some(1)
val o2 = Some(2)
val o3 = Some(3)
val result = (o1 |@| o2 |@| o3) {_ + _ + _}
Run Code Online (Sandbox Code Playgroud)

有一个关于Applicatives和函子一个非常良好的阅读这里

根据此博客,

运算符| @ | 是产品操作

使用| @ |将您的应用组合成产品 会导致一个ApplicativeBuilder,该ApplicativeBuilder带有对产品执行的功能(因为product + map是一个非常常见的用例)

我发现很难理解博客中的以上两个陈述。任何在scala中使用代码来理解这一点的示例都会有所帮助。

Yuv*_*kov 5

我认为关键在于这篇文章,这应该有助于说明适用函子的原因:

嘿,所以您将函数包装到了上下文中,对吧?不用担心,我知道如何应用那些包装函数

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

|@|底层类型ApplicativeBuilder只是通过DSL构造这些应用程序的标准方法。

从文档(重点是我的):

尽管scalaz.Functor允许将纯函数应用于上下文中的值,但Applicative也允许将上下文中的 函数应用于上下文中的值ap


运算符| @ | 是产品操作

通过“乘积运算”,OP表示该运算采用两个值并将它们包装在内ApplicativeBuilder

|@|是一种方法,当调用该方法时,将返回的一个实例ApplicativeBuilder

final def |@|[B](fb: F[B]) = new ApplicativeBuilder[F, A, B] {
  val a: F[A] = self
  val b: F[B] = fb
}
Run Code Online (Sandbox Code Playgroud)

定义实例F的一阶种类在哪里Apply

implicit val F: Apply[F]
Run Code Online (Sandbox Code Playgroud)

没有方法的地方Apply就是一个。Applicativepoint

使用| @ |将您的应用组合成产品 会导致一个ApplicativeBuilder,该ApplicativeBuilder带有对产品执行的功能(因为product + map是一个非常常见的用例)

如果您以您的示例为例,并简化了两个Option[Int]秒:

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(_ + _)
Run Code Online (Sandbox Code Playgroud)

我们:

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