There are two ways to define a comonad:
I. Provide definitions for fmap, extract, and duplicate
satisfying these laws:
extract . duplicate == id
fmap extract . duplicate == id
duplicate . duplicate == fmap duplicate . duplicate
II. Provide definitions for extract and extend
satisfying these laws:
extend extract == id
extract . extend f == f
extend f . extend g == extend (f . extend g)
(fmap cannot be defaulted, but a comonad which defines
extend may simply set fmap equal to liftW.)
A comonad providing definitions for extend and duplicate,
must also satisfy these laws:
extend f == fmap f . duplicate
duplicate == extend id
fmap f == extend (f . duplicate)
(The first two are the defaults for extend and duplicate,
and the third is the definition of liftW.)
|