gdritter repos pico-ml-old / master stdlib / Monoid.pml
master

Tree @master (Download .tar.gz)

Monoid.pml @masterraw · history · blame

exports
  Monoid(..)
  empty
  _<>_
  unitMonoid
  additive
  multiplicative
  conjunctive
  disjunctive
  dual
  endo
  reader
  pair

import Num

-- The Monoid type

record Monoid m
  .empty  m
  .append (m -> m -> m)

-- implicit sugars for the Monoid operations

empty : implicit (Monoid m) -> m
  m = m.empty

_<>_ : m -> m -> implicit (Monoid m) -> m
  x y m = m.append x y

-- some Monoid values

implicit unitMonoid : Monoid () = rec
  .empty      = ()
  .append _ _ = ()

additive : implicit (Add m) -> Monoid m
  add = rec .empty  = add.zero
            .append = add.plus

multiplicative : implicit (Mul m) -> Monoid m
  mul = rec .empty  = mul.one
            .append = mul.times

implicit conjunctive : Monoid Bool = rec
  .empty  = False
  .append = _&&_

disjunctive : Monoid Bool = rec
  .empty  = True
  .append = _||_

dual : Monoid m -> Monoid m
  m = rec .empty      = m.empty
          .append x y = m.append y x

endo : Monoid (a -> a) = rec
  .empty      = id
  .append x y = compose x y

reader : implicit (Monoid b) -> Monoid (a -> b)
  m = rec .empty _ = m.empty
          .append x f g = m.append (f x) (g x)

pair : implicit (Monoid l) -> implicit (Monoid r) -> Monoid (l * r)
  l r = rec .empty = (l.empty, r.empty)
            .append (x1, y1) (x2, y2) = (l.append x1 x2, r.append y1 y2)