Divide
Формальное определение
Divide
- контравариантный аналог Apply
.
Он расширяет ковариантный функтор и дополнительно реализует
операцию divide
: def divide[A, B, C](fa: => F[A], fb: => F[B])(f: C => (A, B)): F[C]
Законы Divide
:
- Composition (композиция):
divide(divide(fa1, fa2)(delta), fa3)(delta) == divide(fa1, divide(fa2, fa3)(delta))(delta)
, гдеdelta: A => (A, A) = a => (a, a)
Определение в виде кода на Scala
trait Divide[F[_]] extends ContravariantFunctor[F]:
def divide[A, B, C](fa: => F[A], fb: => F[B])(f: C => (A, B)): F[C]
def tuple2[A, B](fa: => F[A], fb: => F[B]): F[(A, B)] = divide(fa, fb)(identity)
Примеры
Унарная функция
given functionDivide[R: Monoid]: Divide[[X] =>> Function1[X, R]] with
override def cmap[A, B](function: B => R)(f: A => B): A => R =
a => function(f(a))
override def divide[A, B, C](fa: => A => R, fb: => B => R)(f: C => (A, B)): C => R =
c => {
val (a, b) = f(c)
summon[Monoid[R]].combine(fa(a), fb(b))
}
Ссылки: