Slide 54
Slide 54 text
Invariant Monoidal Functors
54
trait InvariantMonoidalLaws[F[_]] extends InvariantLaws[F] {
implicit val tc: InvariantMonoidal[F]
import InvariantMonoidal.ops._
def invmonoidalLeftIdentity[A](fa: F[A]): IsEqv[F[A]] =
tc.pure(()).zip(fa).xmap(_._2)(a => ((), a)) <-> fa
def invmonoidalRightIdentity[A](fa: F[A]): IsEqv[F[A]] =
fa.zip(tc.pure(())).xmap(_._1)(a => (a, ())) <-> fa
def invmonoidalAssociativity[A, B, C](
fa: F[A], fb: F[B], fc: F[C]
): IsEqv[F[(A, (B, C))]] =
fa.zip(fb.zip(fc)) <->
(fa.zip(fb)).zip(fc).
xmap { case ((a, b), c) => (a, (b, c)) }
{ case (a, (b, c)) => ((a, b), c) }
}
Laws are the same as the lax monoidal functor laws, but include an inverse