什么是应用程序构建器
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(_ + _)
我们:
- 将
|@|
应用于 Option[Int]
的两个实例并取回 ApplicativeBuilder[Option, Int, Int]
。 Option
这是我们的 F
,它有一个 Apply
. 的实例
- 取回构建器实例后,我们调用它的
apply
方法。我们为它提供一个形状为 Int -> Int
的函数,它返回一个 Option[Int]
,这意味着我们仍在上下文中,但已将操作应用于我们的值。
我是 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(_ + _)
我们:
- 将
|@|
应用于Option[Int]
的两个实例并取回ApplicativeBuilder[Option, Int, Int]
。Option
这是我们的F
,它有一个Apply
. 的实例
- 取回构建器实例后,我们调用它的
apply
方法。我们为它提供一个形状为Int -> Int
的函数,它返回一个Option[Int]
,这意味着我们仍在上下文中,但已将操作应用于我们的值。