Divisible
Формальное определение
Divisible
- контравариантный аналог Applicative
.
Он расширяет Divide
и InvariantApplicative
.
Законы Divisible
:
- right identity:
divide(fa, conquer)(delta) == fa
, гдеdelta: A => (A, A) = a => (a, a)
- left identity:
divide(conquer, fa)(delta) == fa
Определение в виде кода на Scala
trait Divisible[F[_]] extends Divide[F], InvariantApplicative[F]:
def conquer[A]: F[A]
override def xunit0[A](a: => A): F[A] = conquer
override def cmap[A, B](fb: F[B])(f: A => B): F[A] =
divide(conquer[Unit], fb)(c => ((), f(c)))
Примеры
Унарная функция
given functionDivisible[R: Monoid]: Divisible[[X] =>> Function1[X, R]] with
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))
}
override def conquer[A]: A => R = _ => summon[Monoid[R]].empty
Ссылки: