【发布时间】:2021-06-12 17:53:56
【问题描述】:
我正在浏览 Underscore 的“Scala with Cats”,偶然发现了以下语句:
Cats 提供了一个
cats.syntax.apply模块,该模块利用Semigroupal和Functor允许用户对具有多个参数的函数进行排序。
据我了解,我们只能对具有单个参数的函数进行排序,因为函数只能返回单个值。
import cats.implicits._
val f1: Int => Int = x => x + 1
val f2: Int => Int = x => x * 4
val f3: Int => String = x => s"x = $x"
f1.map(f2).map(f3)(5)
对于以下示例,它表示:在内部 mapN 使用 Semigroupal 从 Option 和 Functor 中提取值以将值应用于函数。
final case class Cat(name: String, born: Int, color: String)
(
Option("Garfield"),
Option(1978),
Option("Orange & black")
).mapN(Cat.apply)
// res10: Option[Cat] = Some(Cat("Garfield", 1978, "Orange & black"))
这里Cat.apply 确实是一个具有多个参数的函数,但它被链接到一个函数,该函数本身返回一个选项元组,即单个值。我们可以让它接受多个参数,如下所示:
final case class Cat(name: String, born: Int, color: String)
val f: (String, Int, String) => (Option[String], Option[Int], Option[String]) =
(name, year, color) => (Option(name), Option(year), Option(color))
f("Garfield", 1978, "Orange & black").mapN(Cat.apply)
现在我们有了函数f 和Cat.apply,它们接受多个参数并链接在一起。是不是上面的声明所指的?但是我似乎无法找到进一步链接更多功能的方法。该语句是否适用于仅在一个级别链接多个参数函数?另外,请注意这里的函数f 与上面描述的单参数函数链接示例相比被急切地应用。这里可以懒惰地应用函数吗?
我在互联网上的 Semigroupal 的任何地方都找不到太多解释。任何人都可以用一个例子来解释这个陈述吗? TIA。
【问题讨论】:
标签: scala scala-cats