我是scala和功能新手,并试图学习应用程序。
val o1 = Some(1)
val o2 = Some(2)
val o3 = Some(3)
val result = (o1 |@| o2 |@| o3) {_ + _ + _}
关于Applicatives和Functors here
的阅读非常好根据这篇博客,
运营商| @ |是产品运作
和
使用| @ |将您的应用程序组合到产品中结果是 ApplicativeBuilder,它具有在产品上执行的功能 (因为产品+地图是一个非常常见的用例)
我发现很难理解博客上面的两个陈述。 任何在scala中使用代码来理解这一点的示例都会有所帮助。
答案 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(_ + _)
我们:
|@|
应用于Option[Int]
的两个实例并返回ApplicativeBuilder[Option, Int, Int]
。 Option
这是我们的F
,其实例为Apply
。apply
方法。我们为它提供了形状Int -> Int
的函数,它给我们一个Option[Int]
,这意味着我们仍然在上下文中,但操作应用于我们的值。