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中使用代码来理解这一点的示例都会有所帮助。
我认为关键在于这篇文章,这应该有助于说明适用函子的原因:
嘿,所以您将函数包装到了上下文中,对吧?不用担心,我知道如何应用那些包装函数
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)
我们:
|@|的两个实例,Option[Int]然后取回ApplicativeBuilder[Option, Int, Int]。Option这是我们的F,其中有一个实例Apply。apply方法。我们为其提供形状函数,Int -> Int并给我们返回a Option[Int],这意味着我们仍在上下文中,但是将运算应用于我们的值。