Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
From Tealeaves Require Import
Classes.Categorical.TraversableFunctor.#[local] Generalizable VariablesT F U G X Y ϕ.#[local] Arguments map F%function_scope {Map}
{A B}%type_scope f%function_scope _.(** * Monoid Structure of Traversable Functors *)(**********************************************************************)(** ** The Identity Functor is Traversable *)(**********************************************************************)#[export] InstanceDist_I:
ApplicativeDist (funA => A) := funFmapmultpureAa => a.#[export, program] InstanceTraversable_I:
TraversableFunctor (funA => A).
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H1: Applicative G
Natural
(@dist (funA : Type => A) Dist_I G Map_G Pure_G
Mult_G)
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H1: Applicative G
forall (AB : Type) (f : A -> B),
map (G ∘ (funA0 : Type => A0)) f
∘ dist (funA0 : Type => A0) G =
dist (funA0 : Type => A0) G
∘ map ((funA0 : Type => A0) ∘ G) f
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H1: Applicative G A, B: Type f: A -> B
map (G ∘ (funA : Type => A)) f
∘ dist (funA : Type => A) G =
dist (funA : Type => A) G
∘ map ((funA : Type => A) ∘ G) f
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H1: Applicative G A, B: Type f: A -> B a: ((funA : Type => A) ∘ G) A
(map (G ∘ (funA : Type => A)) f
∘ dist (funA : Type => A) G) a =
(dist (funA : Type => A) G
∘ map ((funA : Type => A) ∘ G) f) a
G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H1: Applicative G A, B: Type f: A -> B a: ((funA : Type => A) ∘ G) A
(map G f ∘ (funa : G A => a)) a =
Map_compose (funA : Type => A) G A B f a
reflexivity.Qed.
G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H1: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H2: Applicative G2 A: Type
dist (funA : Type => A) (G1 ∘ G2) =
map G1 (dist (funA : Type => A) G2)
∘ dist (funA : Type => A) G1
G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H1: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H2: Applicative G2 A: Type
(funa : (G1 ∘ G2) A => a) =
map G1 (funa : G2 A => a) ∘ (funa : G1 (G2 A) => a)
G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H1: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H2: Applicative G2 A: Type a: (G1 ∘ G2) A
a =
(map G1 (funa : G2 A => a) ∘ (funa : G1 (G2 A) => a))
a
G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H1: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H2: Applicative G2 A: Type a: (G1 ∘ G2) A
(map G1 (funa : G2 A => a) ∘ (funa : G1 (G2 A) => a))
a = a
nowrewrite (fun_map_id (F := G1)).Qed.(** ** Traversable Functors are Closed under Composition *)(**********************************************************************)SectionTraversableFunctor_compose.Context
`{TraversableFunctor T}
`{TraversableFunctor U}.#[export] InstanceDist_compose: ApplicativeDist (T ∘ U) :=
funGGmapmultpureA =>
dist T G ∘ map T (dist U G (A := A)).
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forallA : Type,
dist (T ∘ U) (funA0 : Type => A0) = id
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forallA : Type,
dist (T ∘ U) (funA0 : Type => A0) = id
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U A: Type
dist (T ∘ U) (funA : Type => A) = id
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U A: Type
dist T (funA : Type => A)
∘ map T (dist U (funA : Type => A)) = id
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U A: Type
id ∘ map T (dist U (funA : Type => A)) = id
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U A: Type
id ∘ map T id = id
nowrewrite (fun_map_id (F := T)).Qed.
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
forall (XY : Type) (f : X -> Y),
map (G ∘ (T ∘ U)) f ∘ dist (T ∘ U) G =
dist (T ∘ U) G ∘ map (T ∘ U ∘ G) f
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
forall (XY : Type) (f : X -> Y),
map (G ∘ (T ∘ U)) f ∘ dist (T ∘ U) G =
dist (T ∘ U) G ∘ map (T ∘ U ∘ G) f
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
map (G ∘ (T ∘ U)) f ∘ dist (T ∘ U) G =
dist (T ∘ U) G ∘ map (T ∘ U ∘ G) f
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
map G (map T (map U f))
∘ (dist T G ∘ map T (dist U G)) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
map (G ∘ T) (map U f) ∘ dist T G ∘ map T (dist U G) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
map (G ∘ T) (map U f) ∘ dist T G ∘ map T (dist U G) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G ∘ map (T ∘ G) (map U f) ∘ map T (dist U G) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G ∘ map (T ∘ G) (map U f) ∘ map T (dist U G) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G ∘ map T (map G (map U f)) ∘ map T (dist U G) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G
∘ (map T (map G (map U f)) ∘ map T (dist U G)) =
dist T G ∘ map T (dist U G) ∘ map T (map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G
∘ (map T (map G (map U f)) ∘ map T (dist U G)) =
dist T G
∘ (map T (dist U G) ∘ map T (map U (map G f)))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G
∘ (map T (map G (map U f)) ∘ map T (dist U G)) =
dist T G
∘ (map T (dist U G) ∘ map T (map U (map G f)))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G ∘ map T (map G (map U f) ∘ dist U G) =
dist T G
∘ (map T (dist U G) ∘ map T (map U (map G f)))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G ∘ map T (map G (map U f) ∘ dist U G) =
dist T G ∘ map T (dist U G ∘ map U (map G f))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G X, Y: Type f: X -> Y
dist T G ∘ map T (map (G ∘ U) f ∘ dist U G) =
dist T G ∘ map T (dist U G ∘ map (U ∘ G) f)
nowrewrite <- (natural (ϕ := @dist U _ G _ _ _)).Qed.
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
Natural
(@dist (T ∘ U) Dist_compose G Map_G Pure_G Mult_G)
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
Natural
(@dist (T ∘ U) Dist_compose G Map_G Pure_G Mult_G)
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G
forall (AB : Type) (f : A -> B),
map (G ○ (T ∘ U)) f ∘ dist (T ∘ U) G =
dist (T ∘ U) G ∘ map (T ∘ U ○ G) f
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H5: Applicative G A, B: Type f: A -> B
map (G ○ (T ∘ U)) f ∘ dist (T ∘ U) G =
dist (T ∘ U) G ∘ map (T ∘ U ○ G) f
apply dist_natural_compose.Qed.
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forall (G1G2 : Type -> Type) (H5 : Map G1)
(H6 : Mult G1) (H7 : Pure G1) (H8 : Map G2)
(H9 : Mult G2) (H10 : Pure G2)
(ϕ : forallA : Type, G1 A -> G2 A),
ApplicativeMorphism G1 G2 ϕ ->
forallA : Type,
dist (T ∘ U) G2 ∘ map (T ∘ U) (ϕ A) =
ϕ (T (U A)) ∘ dist (T ∘ U) G1
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
forall (G1G2 : Type -> Type) (H5 : Map G1)
(H6 : Mult G1) (H7 : Pure G1) (H8 : Map G2)
(H9 : Mult G2) (H10 : Pure G2)
(ϕ : forallA : Type, G1 A -> G2 A),
ApplicativeMorphism G1 G2 ϕ ->
forallA : Type,
dist (T ∘ U) G2 ∘ map (T ∘ U) (ϕ A) =
ϕ (T (U A)) ∘ dist (T ∘ U) G1
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ map T (dist U G2) ∘ map T (map U (ϕ A)) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ (map T (dist U G2) ∘ map T (map U (ϕ A))) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ (map T (dist U G2) ∘ map T (map U (ϕ A))) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ map T (dist U G2 ∘ map U (ϕ A)) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ map T (ϕ (U A) ∘ dist U G1) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ (map T (ϕ (U A)) ∘ map T (dist U G1)) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1, G2: Type -> Type H5: Map G1 H6: Mult G1 H7: Pure G1 H8: Map G2 H9: Mult G2 H10: Pure G2 ϕ: forallA : Type, G1 A -> G2 A H11: ApplicativeMorphism G1 G2 ϕ A: Type
dist T G2 ∘ map T (ϕ (U A)) ∘ map T (dist U G1) =
ϕ (T (U A)) ∘ (dist T G1 ∘ map T (dist U G1))
nowrewrite (dist_morph (F := T)).Qed.
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2 ∘ map T (dist U G2))
∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2) ∘ map G1 (map T (dist U G2))
∘ (dist T G1 ∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2)
∘ (map (G1 ∘ T) (dist U G2) ∘ dist T G1
∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2)
∘ (map (G1 ∘ T) (dist U G2) ∘ dist T G1
∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map (T ○ G1) (dist U G2)
∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map (T ○ G1) (dist U G2)
∘ map T (dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map T (map G1 (dist U G2) ∘ dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2) ∘ map T (dist U (G1 ∘ G2)) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map T (map G1 (dist U G2) ∘ dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
dist T (G1 ∘ G2)
∘ map T (map G1 (dist U G2) ∘ dist U G1) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map T (map G1 (dist U G2) ∘ dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
map G1 (dist T G2) ∘ dist T G1
∘ map T (map G1 (dist U G2) ∘ dist U G1) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map T (map G1 (dist U G2) ∘ dist U G1))
T: Type -> Type H: Map T H0: ApplicativeDist T H1: TraversableFunctor T U: Type -> Type H2: Map U H3: ApplicativeDist U H4: TraversableFunctor U G1: Type -> Type Map_G: Map G1 Pure_G: Pure G1 Mult_G: Mult G1 H5: Applicative G1 G2: Type -> Type Map_G0: Map G2 Pure_G0: Pure G2 Mult_G0: Mult G2 H6: Applicative G2 A: Type
map G1 (dist T G2) ∘ dist T G1
∘ map T (map G1 (dist U G2) ∘ dist U G1) =
map G1 (dist T G2)
∘ (dist T G1 ∘ map T (map G1 (dist U G2) ∘ dist U G1))
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T
TraversableMorphism (funA : Type => A) T (@ret T H0)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T
TraversableMorphism (funA : Type => A) T (@ret T H0)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
forallA : Type,
map G ret ∘ dist (funA0 : Type => A0) G =
dist T G ∘ ret
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H4: Applicative G A: Type
map G ret ∘ dist (funA : Type => A) G =
dist T G ∘ ret
nowrewrite (trvmon_ret).Qed.
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T
TraversableMorphism (T ∘ T) T (@join T H1)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T
TraversableMorphism (T ∘ T) T (@join T H1)
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T
forall (G : Type -> Type) (Map_G : Map G)
(Pure_G : Pure G) (Mult_G : Mult G),
Applicative G ->
forallA : Type,
map G join ∘ dist (T ∘ T) G = dist T G ∘ join
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H4: Applicative G A: Type
map G join ∘ dist (T ∘ T) G = dist T G ∘ join
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H4: Applicative G A: Type
map G join ∘ (dist T G ∘ map T (dist T G)) =
dist T G ∘ join
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H4: Applicative G A: Type
map G join ∘ dist T G ∘ map T (dist T G) =
dist T G ∘ join
T: Type -> Type H: Map T H0: Return T H1: Join T H2: ApplicativeDist T H3: TraversableMonad T G: Type -> Type Map_G: Map G Pure_G: Pure G Mult_G: Mult G H4: Applicative G A: Type
map G join ∘ dist T G ∘ map T (dist T G) =
dist T G ∘ join