在 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