8. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a;
unit_right:
forall (A: Set)(m: T A),
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' ->
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
9. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a;
unit_right:
forall (A: Set)(m: T A),
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' ->
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
10. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a; モナド則
unit_right:
forall (A: Set)(m: T A), (Kleisli Tripleの3等式)
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' ->
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
11. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a; モナド則
unit_right:
forall (A: Set)(m: T A), (Kleisli Tripleの3等式)
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' -> モナド自体も推論の対象
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
12. Record TypeModifier: Type :=
{
tm_modify :> Set -> Set;
tm_equivalence {A: Set}: Equivalence (tm_modify A)
}.
Notation "A =t= B" := (equiv_eq (Equivalence:=tm_equivalence _) A B)
(at level 70, no associativity).
Reserved Notation "x >>= y" (at level 60, left associativity).
Class Monad (T: TypeModifier):=
{
ret {A: Set}: A -> T A;
bind {A B: Set}: (A -> T B) -> T A -> T B
where "x >>= y" := (bind y x);
unit_left:
forall (A B: Set)(f: A -> T B)(a: A),
(ret a) >>= f =t= f a; モナド則
unit_right:
forall (A: Set)(m: T A), (Kleisli Tripleの3等式)
m >>= ret =t= m;
assoc:
forall (A B C: Set)(f: A -> T B)(g: B -> T C)(m: T A),
(m >>= f >>= g) =t= m >>= (fun x => (f x) >>= g);
bind_subst:
等式推論のみ
forall (A B: Set)(m m': T A)(f f': A -> T B),
m =t= m' -> モナド自体も推論の対象
(forall a: A, f a =t= f' a) ->
m >>= f =t= m' >>= f'
}.
36. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
37. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
38. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
39. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
40. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
(T ⌘X )⌫X ⌧X ✓X = id⌧X
41. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
(T ⌘X )⌫X ⌧X ✓X = id⌧X
(µT X )⌫X ⌫ T X ⌧X = (T µX )⌫X ⌧T 2 X ⌫ X
42. モナド with P.L. のモナド則
µX ⌘T X = idT X
µX T ⌘X = idT X
µX µT X = µX T µX
(⌘T X )⌫X ✓T X ⌧X = id⌧X
(T ⌘X )⌫X ⌧X ✓X = id⌧X
(µT X )⌫X ⌫ T X ⌧X = (T µX )⌫X ⌧T 2 X ⌫ X