module Data.Group where import Data.Complex import Prelude hiding (Num(..)) infixl 6 << -- |A 'Group' is a 'Monoid' plus a function, 'negate', such that: -- -- @a << negate a == mempty@ -- -- @negate a << a == mempty@ -- class Monoid a => Group a where {-# MINIMAL (negate | (<<)) #-} negate :: a -> a negate x = mempty << x (<<) :: a -> a -> a x << y = x <> negate y instance (Monoid (Complex a), Group a) => Group (Complex a) where negate (x :+ y) = negate x :+ negate y