module Data.Quasigroup ( module Data.Magma , Quasigroup (..) ) where import Control.Applicative import Data.Magma -- | A 'Quasigroup' is a nonempty 'Magma' with left and right -- division. class Magma q => Quasigroup q where -- | Left division. @y = x + (x `leftDivide` y)@ and @y = x -- `leftDivide` (x + y)@. leftDivide :: q -> q -> q -- | Right division. @y = (y `rightDivide` x) + x@ and @y = (y + -- x) `rightDivide` x@. rightDivide :: q -> q -> q instance Quasigroup b => Quasigroup (a -> b) where leftDivide = map2 leftDivide rightDivide = map2 rightDivide