在 Scala Cats 中使用案例 Semigroupal 和 Apply
Use cases Semigroupal and Apply in Scala Cats
考虑到 Herding Cats 中的两章,semigroupal and apply,我似乎找不到它们的一些用例。您能否举例说明何时使用哪个?
例如,您可以 运行 两个平行的期货,如果它们是独立的,然后合并它们的结果
cats.Apply[Future].map2(Future(1), Future(41))(_ + _)
而不是
Future(1).flatMap(a => Future(41).map(b => a + b))
其中内部 Future(41)
必须先等待外部 Future(1)
完成。
Semigroupal
提供单一能力,即product
其中
Combine an F[A]
and an F[B]
into an F[(A, B)]
例如
cats.Semigroupal[Future].product(Future(1), Future(42))
// res0: Future[(Int, Int)] = Future(Success((1,42)))
本身可以说不是很有用,但是当与 Functor
结合使用时,我们能够映射乘积,因此现在我们可以对有效乘积执行计算,因此 Apply[A]
是a 制作了 Functor[A]
和 Semigroupal[A]
的子类型,例如
implicitly[Apply[Future] <:< (Functor[Future] with Semigroupal[Future])] // ok
考虑到 Herding Cats 中的两章,semigroupal and apply,我似乎找不到它们的一些用例。您能否举例说明何时使用哪个?
例如,您可以 运行 两个平行的期货,如果它们是独立的,然后合并它们的结果
cats.Apply[Future].map2(Future(1), Future(41))(_ + _)
而不是
Future(1).flatMap(a => Future(41).map(b => a + b))
其中内部 Future(41)
必须先等待外部 Future(1)
完成。
Semigroupal
提供单一能力,即product
其中
Combine an
F[A]
and anF[B]
into anF[(A, B)]
例如
cats.Semigroupal[Future].product(Future(1), Future(42))
// res0: Future[(Int, Int)] = Future(Success((1,42)))
本身可以说不是很有用,但是当与 Functor
结合使用时,我们能够映射乘积,因此现在我们可以对有效乘积执行计算,因此 Apply[A]
是a 制作了 Functor[A]
和 Semigroupal[A]
的子类型,例如
implicitly[Apply[Future] <:< (Functor[Future] with Semigroupal[Future])] // ok