monoid-subclasses-1.2.4.1: Subclasses of Monoid
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Monoid.LCM

Description

This module defines the LCMMonoid subclass of the Monoid class.

The LCMMonoid subclass adds the lcm operation, which takes two monoidal arguments and finds their least common multiple, or (more generally) the least monoid from which either argument can be subtracted with the </> operation.

For LCM monoids that are distributive, this module also provides the DistributiveLCMMonoid subclass of LCMMonoid.

All classes in this module are for Abelian, i.e., Commutative monoids.

Synopsis

Documentation

class GCDMonoid m => LCMMonoid m where Source #

Class of Abelian monoids that allow the least common multiple to be found for any two given values.

Operations must satisfy the following laws:

Reductivity

isJust (lcm a b </> a)
isJust (lcm a b </> b)

Uniqueness

all isJust
    [       c </> a
    ,       c </> b
    , lcm a b </> c
    ]
==>
    (lcm a b == c)

Idempotence

lcm a a == a

Identity

lcm mempty a == a
lcm a mempty == a

Commutativity

lcm a b == lcm b a

Associativity

lcm (lcm a b) c == lcm a (lcm b c)

Absorption

lcm a (gcd a b) == a
gcd a (lcm a b) == a

Methods

lcm :: m -> m -> m Source #

Instances

Instances details
LCMMonoid IntSet Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: IntSet -> IntSet -> IntSet Source #

LCMMonoid () Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: () -> () -> () Source #

LCMMonoid a => LCMMonoid (Dual a) Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: Dual a -> Dual a -> Dual a Source #

LCMMonoid (Product Natural) Source # 
Instance details

Defined in Data.Monoid.LCM

LCMMonoid (Sum Natural) Source # 
Instance details

Defined in Data.Monoid.LCM

Ord a => LCMMonoid (Set a) Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: Set a -> Set a -> Set a Source #

(LCMMonoid a, LCMMonoid b) => LCMMonoid (a, b) Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: (a, b) -> (a, b) -> (a, b) Source #

(LCMMonoid a, LCMMonoid b, LCMMonoid c) => LCMMonoid (a, b, c) Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: (a, b, c) -> (a, b, c) -> (a, b, c) Source #

(LCMMonoid a, LCMMonoid b, LCMMonoid c, LCMMonoid d) => LCMMonoid (a, b, c, d) Source # 
Instance details

Defined in Data.Monoid.LCM

Methods

lcm :: (a, b, c, d) -> (a, b, c, d) -> (a, b, c, d) Source #

class (DistributiveGCDMonoid m, LCMMonoid m) => DistributiveLCMMonoid m Source #

Class of commutative LCM monoids with distributivity.

In addition to the general LCMMonoid laws, instances of this class must also satisfy the following laws:

The lcm operation itself must be both left-distributive and right-distributive:

lcm (a <> b) (a <> c) == a <> lcm b c
lcm (a <> c) (b <> c) == lcm a b <> c

The lcm and gcd operations must distribute over one another:

lcm a (gcd b c) == gcd (lcm a b) (lcm a c)
gcd a (lcm b c) == lcm (gcd a b) (gcd a c)

Instances

Instances details
DistributiveLCMMonoid IntSet Source # 
Instance details

Defined in Data.Monoid.LCM

DistributiveLCMMonoid () Source # 
Instance details

Defined in Data.Monoid.LCM

DistributiveLCMMonoid a => DistributiveLCMMonoid (Dual a) Source # 
Instance details

Defined in Data.Monoid.LCM

DistributiveLCMMonoid (Product Natural) Source # 
Instance details

Defined in Data.Monoid.LCM

DistributiveLCMMonoid (Sum Natural) Source # 
Instance details

Defined in Data.Monoid.LCM

Ord a => DistributiveLCMMonoid (Set a) Source # 
Instance details

Defined in Data.Monoid.LCM