packages feed

idris-0.9.1: lib/prelude/algebra.idr

module algebra

import builtins

-- Sets with an associative binary operation
-- Must satisfy:
--   forall a, b, c. a <*> (b <*> c) = (a <*> b) <*> c
class Semigroup a where
  (<*>)        : a -> a -> a

-- Sets with an associative binary operation and a neutral element
-- Must satisfy:
--   forall a, b, c. a <*> (b <*> c) = (a <*> b) <*> c
--   forall a.       neutral <*> a   = a <*> neutral   = a
class Semigroup a => Monoid a where
  neutral : a

-- Sets with an associative binary operation, a neutral element, as well as
-- inverses
-- Must satisfy:
--   forall a, b, c. a <*> (b <*> c)     = (a <*> b) <*> c
--   forall a.       neutral <*> a       = a <*> neutral   = a
--   forall a.       inverse a <*> a     = a <*> inverse   = neutral
--   forall a.       inverse (inverse a) = a
class Monoid a => Group a where
  inverse : a -> a
  (<->)   : a -> a -> a

-- XXX: to add:
--   ring, field, euclidean domain, abelian group, vector spaces, etc.?
--   do we want proofs of properties in the type classes?
--   derived classes, some mechanism for multiple e.g. monoids on same type