Tealeaves.Classes.Categorical.Comonad

From Tealeaves Require Export
  Classes.Functor
  Functors.Identity
  Functors.Compose.

Import Functor.Notations.

#[local] Generalizable Variables W A B C D.

Comonads

Operations cojoin and extract

Class Extract (W: Type Type) :=
  extract: W (fun AA).
Class Cojoin (W: Type Type) :=
  cojoin: W W W.

#[global] Arguments extract {W}%function_scope {Extract} {A}%type_scope.
#[global] Arguments cojoin {W}%function_scope {Cojoin} {A}%type_scope.

Typeclass

Class Comonad (W: Type Type)
  `{Map_W: Map W}
  `{Cojoin_W: Cojoin W}
  `{Extract_W: Extract W} :=
  { com_functor :> Functor W;
    com_extract_natural :> Natural (@extract W _);
    com_cojoin_natural :> Natural (@cojoin W _);
    com_extract_cojoin:
    `(extract (A := W A) cojoin (A := A) = @id (W A));
    com_map_extr_cojoin:
    `(map (F := W) (extract (A := A)) cojoin (A := A) = @id (W A));
    com_cojoin_cojoin:
    `(cojoin (A := W A) cojoin (A := A) =
        map (F := W) (cojoin (A := A)) cojoin (A := A));
  }.

Notations

Module Notations.
  Notation "'coμ'" := cojoin: tealeaves_scope.
End Notations.