什么是Applicative Builder

时间:2017-09-11 09:57:18

标签: scala functional-programming applicative

我是scala和功能新手,并试图学习应用程序。

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

关于Applicatives和Functors here

的阅读非常好

根据这篇博客,

  

运营商| @ |是产品运作

  

使用| @ |将您的应用程序组合到产品中结果是   ApplicativeBuilder,它具有在产品上执行的功能   (因为产品+地图是一个非常常见的用例)

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

1 个答案:

答案 0 :(得分:3)

我认为关键是从帖子中删除,这应该有助于推理应用函子是这句话:

  

嘿,所以你的功能被包含在某个环境中,是吗?   不用担心,我知道如何应用这些包装函数

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

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

从文档(强调我的):

  

scalaz.Functor允许应用纯函数   在上下文中的值,Applicative也允许应用a   在上下文中对上下文中的值进行操作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
}

其中F是定义Apply实例的第一类订单:

implicit val F: Apply[F]

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

  

使用| @ |将您的应用程序组合到产品中结果是   ApplicativeBuilder,它具有在产品上执行的功能   (因为产品+地图是一个非常常见的用例)

如果你我们举了你的例子,并为两个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. 在获取构建器的实例后,我们调用它的apply方法。我们为它提供了形状Int -> Int的函数,它给我们一个Option[Int],这意味着我们仍然在上下文中,但操作应用于我们的值。