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 Export
Tactics.Prelude
Functors.Identity
Classes.Categorical.Monad (Return, ret).Import Functor.Notations.#[local] Generalizable VariableT.(** * Monads *)(**********************************************************************)(** ** Operations *)(**********************************************************************)ClassBind (TU: Type -> Type) :=
bind: forall (AB: Type), (A -> T B) -> U A -> U B.#[global] Arguments bind {T} {U}%function_scope {Bind}
{A B}%type_scope _%function_scope _.(** ** Kleisli Composition *)(**********************************************************************)Definitionkc {T: Type -> Type} `{Return T} `{Bind T T}
{A B C: Type} (g: B -> T C) (f: A -> T B): (A -> T C) :=
@bind T T _ B C g ∘ f.#[local] Infix"⋆" := (kc) (at level60): tealeaves_scope.(** ** Typeclasses *)(**********************************************************************)ClassRightPreModule
(TU: Type -> Type)
`{Return T} `{Bind T T} `{Bind T U} :=
{ kmod_bind1: forall (A: Type),
bind (U := U) ret = @id (U A);
kmod_bind2: forall (ABC: Type) (g: B -> T C) (f: A -> T B),
bind (U := U) g ∘ bind f = bind (g ⋆ f);
}.ClassMonad (T: Type -> Type)
`{Return_T: Return T}
`{Bind_TT: Bind T T} :=
{ kmon_bind0: forall (AB: Type) (f: A -> T B),
bind f ∘ ret = f;
kmon_premod :> RightPreModule T T;
}.ClassRightModule (T: Type -> Type) (U: Type -> Type)
`{Return_T: Return T}
`{Bind_TT: Bind T T}
`{Bind_TU: Bind T U} :=
{ kmod_monad :> Monad T;
kmod_premod :> RightPreModule T U;
}.#[local] InstanceRightModule_Monad
(T: Type -> Type)
`{Monad_T: Monad T}: RightModule T T :=
{| kmod_monad := Monad_T;
|}.(* right unit law of the monoid *)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forallA : Type, bind ret = id
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forallA : Type, bind ret = id
apply kmod_bind1.Qed.(* associativity of the monoid *)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (ABC : Type) (g : B -> T C) (f : A -> T B),
bind g ∘ bind f = bind (g ⋆ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (ABC : Type) (g : B -> T C) (f : A -> T B),
bind g ∘ bind f = bind (g ⋆ f)
apply kmod_bind2.Qed.(** ** Kleisli Category Laws *)(**********************************************************************)SectionMonad_Kleisli_category.Context
`{Monad T}.#[local] Generalizable VariablesA B C D.(** *** Left identity law *)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (AB : Type) (f : A -> T B), ret ⋆ f = f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (AB : Type) (f : A -> T B), ret ⋆ f = f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T A, B: Type f: A -> T B
ret ⋆ f = f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T A, B: Type f: A -> T B
bind ret ∘ f = f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T A, B: Type f: A -> T B
id ∘ f = f
reflexivity.Qed.(** *** Right identity law *)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (BC : Type) (g : B -> T C), g ⋆ ret = g
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (BC : Type) (g : B -> T C), g ⋆ ret = g
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T B, C: Type g: B -> T C
g ⋆ ret = g
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T B, C: Type g: B -> T C
bind g ∘ ret = g
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T B, C: Type g: B -> T C
g = g
reflexivity.Qed.(** *** Associativity law *)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (CD : Type) (h : C -> T D) (B : Type)
(g : B -> T C) (A : Type) (f : A -> T B),
h ⋆ (g ⋆ f) = (h ⋆ g) ⋆ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T
forall (CD : Type) (h : C -> T D) (B : Type)
(g : B -> T C) (A : Type) (f : A -> T B),
h ⋆ (g ⋆ f) = (h ⋆ g) ⋆ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T C, D: Type h: C -> T D B: Type g: B -> T C A: Type f: A -> T B
h ⋆ (g ⋆ f) = (h ⋆ g) ⋆ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T C, D: Type h: C -> T D B: Type g: B -> T C A: Type f: A -> T B
h ⋆ (g ⋆ f) = bind (h ⋆ g) ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T C, D: Type h: C -> T D B: Type g: B -> T C A: Type f: A -> T B
h ⋆ (g ⋆ f) = bind h ∘ bind g ∘ f
reflexivity.Qed.EndMonad_Kleisli_category.(** ** Monad Homomorphisms *)(**********************************************************************)ClassMonadHom (TU: Type -> Type)
`{Return T} `{Bind T T}
`{Return U} `{Bind U U}
(ϕ: forall (A: Type), T A -> U A) :=
{ kmon_hom_bind: forall (AB: Type) (f: A -> T B),
ϕ B ∘ bind f = bind (ϕ B ∘ f) ∘ ϕ A;
kmon_hom_ret: forall (A: Type),
ϕ A ∘ ret (T := T) = ret;
}.ClassRightModuleHom (TUV: Type -> Type)
`{Return T} `{Bind T U} `{Bind T V}
(ϕ: forall (A: Type), U A -> V A) :=
{ kmod_hom_bind: forall (AB: Type) (f: A -> T B),
ϕ B ∘ @bind T U _ A B f = @bind T V _ A B f ∘ ϕ A;
}.ClassParallelRightModuleHom (TT'UU': Type -> Type)
`{Return T} `{Bind T U} `{Bind T' U'}
(ψ: forall (A: Type), T A -> T' A)
(ϕ: forall (A: Type), U A -> U' A) :=
{ kmodpar_hom_bind: forall (AB: Type) (f: A -> T B),
ϕ B ∘ @bind T U _ A B f = @bind T' U' _ A B (ψ B ∘ f) ∘ ϕ A;
}.(** * Derived Structures *)(**********************************************************************)(** ** Derived Operations *)(**********************************************************************)ModuleDerivedOperations.#[export] InstanceMap_Bind (TU: Type -> Type)
`{Return_T: Return T}
`{Bind_TU: Bind T U}: Map U :=
funAB (f: A -> B) => @bind T U Bind_TU A B (@ret T Return_T B ∘ f).EndDerivedOperations.ClassCompat_Map_Bind
(T: Type -> Type)
(U: Type -> Type)
`{Return_T: Return T}
`{Map_U: Map U}
`{Bind_TU: Bind T U}: Prop :=
compat_map_bind:
@Map_U = @DerivedOperations.Map_Bind T U Return_T Bind_TU.
T, U: Type -> Type Return_T: Return T Bind_TU: Bind T U
Compat_Map_Bind T U
T, U: Type -> Type Return_T: Return T Bind_TU: Bind T U
Compat_Map_Bind T U
reflexivity.Qed.
T, U: Type -> Type Return_T: Return T Map_U: Map U Bind_TU: Bind T U Compat_Map_Bind0: Compat_Map_Bind T U
forall (AB : Type) (f : A -> B),
map f = bind (ret ∘ f)
T, U: Type -> Type Return_T: Return T Map_U: Map U Bind_TU: Bind T U Compat_Map_Bind0: Compat_Map_Bind T U
forall (AB : Type) (f : A -> B),
map f = bind (ret ∘ f)
T, U: Type -> Type Return_T: Return T Map_U: Map U Bind_TU: Bind T U Compat_Map_Bind0: Compat_Map_Bind T U
forall (AB : Type) (f : A -> B),
DerivedOperations.Map_Bind T U A B f = bind (ret ∘ f)
reflexivity.Qed.(** ** Derived Kleisli Composition laws *)(**********************************************************************)Sectionderived_kleisli_composition_laws.Context
`{Monad T} `{Map T} `{! Compat_Map_Bind T T}.#[local] Generalizable VariablesA B C D.(** *** Special cases for Kleisli composition *)(********************************************************************)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> C) (A : Type)
(f : A -> B), ret ∘ g ⋆ ret ∘ f = ret ∘ (g ∘ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> C) (A : Type)
(f : A -> B), ret ∘ g ⋆ ret ∘ f = ret ∘ (g ∘ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> B
ret ∘ g ⋆ ret ∘ f = ret ∘ (g ∘ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> B
bind (ret ∘ g) ∘ (ret ∘ f) = ret ∘ (g ∘ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> B
bind (ret ∘ g) ∘ ret ∘ f = ret ∘ (g ∘ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> B
ret ∘ g ∘ f = ret ∘ (g ∘ f)
reflexivity.Qed.
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> T C) (A : Type)
(f : A -> B), g ⋆ ret ∘ f = g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> T C) (A : Type)
(f : A -> B), g ⋆ ret ∘ f = g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> T C A: Type f: A -> B
g ⋆ ret ∘ f = g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> T C A: Type f: A -> B
bind g ∘ (ret ∘ f) = g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> T C A: Type f: A -> B
bind g ∘ ret ∘ f = g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> T C A: Type f: A -> B
g ∘ f = g ∘ f
reflexivity.Qed.
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> C) (A : Type)
(f : A -> T B), ret ∘ g ⋆ f = map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> C) (A : Type)
(f : A -> T B), ret ∘ g ⋆ f = map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> T B
ret ∘ g ⋆ f = map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> T B
bind (ret ∘ g) ∘ f = map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C A: Type f: A -> T B
bind (ret ∘ g) ∘ f = bind (ret ∘ g) ∘ f
reflexivity.Qed.(** *** Other rules for Kleisli composition *)(********************************************************************)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> C) (D : Type)
(h : C -> T D) (A : Type) (f : A -> T B),
h ∘ g ⋆ f = h ⋆ map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (BC : Type) (g : B -> C) (D : Type)
(h : C -> T D) (A : Type) (f : A -> T B),
h ∘ g ⋆ f = h ⋆ map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C D: Type h: C -> T D A: Type f: A -> T B
h ∘ g ⋆ f = h ⋆ map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C D: Type h: C -> T D A: Type f: A -> T B
bind (h ∘ g) ∘ f = bind h ∘ (map g ∘ f)
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C D: Type h: C -> T D A: Type f: A -> T B
bind (h ∘ g) ∘ f = bind h ∘ map g ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C D: Type h: C -> T D A: Type f: A -> T B
bind (h ∘ g) ∘ f = bind h ∘ bind (ret ∘ g) ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C D: Type h: C -> T D A: Type f: A -> T B
bind (h ∘ g) ∘ f = bind (h ⋆ ret ∘ g) ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T B, C: Type g: B -> C D: Type h: C -> T D A: Type f: A -> T B
bind (h ∘ g) ∘ f = bind (h ∘ g) ∘ f
reflexivity.Qed.
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (AB : Type) (f : A -> B) (C : Type)
(g : B -> T C) (D : Type) (h : C -> T D),
h ⋆ g ∘ f = (h ⋆ g) ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T
forall (AB : Type) (f : A -> B) (C : Type)
(g : B -> T C) (D : Type) (h : C -> T D),
h ⋆ g ∘ f = (h ⋆ g) ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T A, B: Type f: A -> B C: Type g: B -> T C D: Type h: C -> T D
h ⋆ g ∘ f = (h ⋆ g) ∘ f
T: Type -> Type Return_T: Return T Bind_TT: Bind T T H: Monad T H0: Map T Compat_Map_Bind0: Compat_Map_Bind T T A, B: Type f: A -> B C: Type g: B -> T C D: Type h: C -> T D
bind h ∘ (g ∘ f) = bind h ∘ g ∘ f
reflexivity.Qed.Endderived_kleisli_composition_laws.(** ** Derived Composition Laws *)(**********************************************************************)Sectionderived_instances.#[local] Generalizable VariablesU A B C.Context
`{RightModule_TU: RightPreModule T U}
`{Map_U: Map U}
`{Map_T: Map T}
`{! Compat_Map_Bind T U}
`{! Compat_Map_Bind T T}
`{Monad_T: ! Monad T}.(** *** Composition between [bind] and [map] *)(********************************************************************)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forall (BC : Type) (g : B -> T C) (A : Type)
(f : A -> B), bind g ∘ map f = bind (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forall (BC : Type) (g : B -> T C) (A : Type)
(f : A -> B), bind g ∘ map f = bind (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> T C A: Type f: A -> B
bind g ∘ map f = bind (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> T C A: Type f: A -> B
bind g ∘ bind (ret ∘ f) = bind (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> T C A: Type f: A -> B
bind (g ⋆ ret ∘ f) = bind (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> T C A: Type f: A -> B
bind (g ∘ f) = bind (g ∘ f)
reflexivity.Qed.
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forall (BC : Type) (g : B -> C) (A : Type)
(f : A -> T B), map g ∘ bind f = bind (map g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forall (BC : Type) (g : B -> C) (A : Type)
(f : A -> T B), map g ∘ bind f = bind (map g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> C A: Type f: A -> T B
map g ∘ bind f = bind (map g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> C A: Type f: A -> T B
bind (ret ∘ g) ∘ bind f = bind (map g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> C A: Type f: A -> T B
bind (ret ∘ g ⋆ f) = bind (map g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T B, C: Type g: B -> C A: Type f: A -> T B
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forallA : Type, map id = id
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forallA : Type, map id = id
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A: Type
map id = id
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A: Type
bind (ret ∘ id) = id
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A: Type
bind ret = id
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A: Type
id = id
reflexivity.Qed.
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forall (ABC : Type) (f : A -> B) (g : B -> C),
map g ∘ map f = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T
forall (ABC : Type) (f : A -> B) (g : B -> C),
map g ∘ map f = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A, B, C: Type f: A -> B g: B -> C
map g ∘ map f = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A, B, C: Type f: A -> B g: B -> C
bind (ret ∘ g) ∘ map f = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A, B, C: Type f: A -> B g: B -> C
bind (ret ∘ g) ∘ bind (ret ∘ f) = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A, B, C: Type f: A -> B g: B -> C
bind (ret ∘ g ⋆ ret ∘ f) = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A, B, C: Type f: A -> B g: B -> C
bind (ret ∘ (g ∘ f)) = map (g ∘ f)
T, U: Type -> Type H: Return T H0: Bind T T H1: Bind T U RightModule_TU: RightPreModule T U Map_U: Map U Map_T: Map T Compat_Map_Bind0: Compat_Map_Bind T U Compat_Map_Bind1: Compat_Map_Bind T T Monad_T: Monad T A, B, C: Type f: A -> B g: B -> C