-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Commutative semigroups
--   
--   A commutative semigroup is a semigroup where the order of arguments to
--   mappend does not matter.
@package commutative-semigroups
@version 0.1.1.0

module Numeric.Product.Commutative

-- | Subclass of <a>Num</a> where <a>(*)</a> is commutative.
--   
--   <a>Num</a> doesn't demand commutative <a>(*)</a>, and there are
--   reasonable "real-world" instances with non-commutative multiplication.
--   There is also no canonical subclass in <tt>base</tt> that would
--   suffice, as both <a>Integral</a> and <a>Floating</a> imply commutative
--   <a>(*)</a> for different reasons.
--   
--   Two examples of non-commutative <a>(*)</a>:
--   
--   <ul>
--   <li><tt>Linear.Quaternion.Quaterion</tt> from the <tt>linear</tt>
--   package has a <a>Num</a> instance, and quaternion multiplication is
--   noncommutative.</li>
--   <li><tt>Data.Matrix.Matrix</tt> from the <tt>matrix</tt> package uses
--   <a>(*)</a> for matrix multiplication, which is also non-commutative
--   (on square matrices, which is the only time the question makes
--   sense).</li>
--   </ul>
class Num a => CommutativeProduct a
instance Numeric.Product.Commutative.CommutativeProduct GHC.Int.Int8
instance Numeric.Product.Commutative.CommutativeProduct GHC.Int.Int16
instance Numeric.Product.Commutative.CommutativeProduct GHC.Int.Int32
instance Numeric.Product.Commutative.CommutativeProduct GHC.Int.Int64
instance Numeric.Product.Commutative.CommutativeProduct GHC.Types.Int
instance Numeric.Product.Commutative.CommutativeProduct GHC.Num.Integer.Integer
instance Numeric.Product.Commutative.CommutativeProduct GHC.Word.Word8
instance Numeric.Product.Commutative.CommutativeProduct GHC.Word.Word16
instance Numeric.Product.Commutative.CommutativeProduct GHC.Word.Word32
instance Numeric.Product.Commutative.CommutativeProduct GHC.Word.Word64
instance Numeric.Product.Commutative.CommutativeProduct GHC.Types.Word
instance Numeric.Product.Commutative.CommutativeProduct GHC.Num.Natural.Natural
instance Numeric.Product.Commutative.CommutativeProduct GHC.Types.Float
instance Numeric.Product.Commutative.CommutativeProduct GHC.Types.Double
instance (GHC.Float.RealFloat a, Numeric.Product.Commutative.CommutativeProduct a) => Numeric.Product.Commutative.CommutativeProduct (Data.Complex.Complex a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Functor.Identity.Identity a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Semigroup.Internal.Sum a)
instance (GHC.Real.Integral a, Numeric.Product.Commutative.CommutativeProduct a) => Numeric.Product.Commutative.CommutativeProduct (GHC.Real.Ratio a)
instance (Data.Fixed.HasResolution a, Numeric.Product.Commutative.CommutativeProduct a) => Numeric.Product.Commutative.CommutativeProduct (Data.Fixed.Fixed a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Semigroup.Min a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Semigroup.Max a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Semigroup.Internal.Product a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Functor.Const.Const a b)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Ord.Down a)
instance Numeric.Product.Commutative.CommutativeProduct a => Numeric.Product.Commutative.CommutativeProduct (Data.Functor.Contravariant.Op a b)
instance Numeric.Product.Commutative.CommutativeProduct (f a) => Numeric.Product.Commutative.CommutativeProduct (Data.Semigroup.Internal.Alt f a)

module Data.Semigroup.Commutative

-- | A <a>Commutative</a> semigroup is a <a>Semigroup</a> that follows the
--   rule:
--   
--   <pre>
--   a &lt;&gt; b == b &lt;&gt; a
--   </pre>
class Semigroup g => Commutative g
instance Data.Semigroup.Commutative.Commutative ()
instance Data.Semigroup.Commutative.Commutative Data.Semigroup.Internal.All
instance Data.Semigroup.Commutative.Commutative Data.Semigroup.Internal.Any
instance Data.Semigroup.Commutative.Commutative GHC.Base.Void
instance GHC.Classes.Ord a => Data.Semigroup.Commutative.Commutative (Data.Semigroup.Max a)
instance GHC.Classes.Ord a => Data.Semigroup.Commutative.Commutative (Data.Semigroup.Min a)
instance (Data.Semigroup.Commutative.Commutative a, GHC.Base.Monoid a) => Data.Semigroup.Commutative.Commutative (Data.Semigroup.WrappedMonoid a)
instance Data.Semigroup.Commutative.Commutative GHC.Event.Internal.Types.Event
instance Data.Semigroup.Commutative.Commutative GHC.Event.Internal.Types.Lifetime
instance Data.Semigroup.Commutative.Commutative a => Data.Semigroup.Commutative.Commutative (GHC.Maybe.Maybe a)
instance GHC.Num.Num a => Data.Semigroup.Commutative.Commutative (Data.Semigroup.Internal.Sum a)
instance Numeric.Product.Commutative.CommutativeProduct a => Data.Semigroup.Commutative.Commutative (Data.Semigroup.Internal.Product a)
instance Data.Semigroup.Commutative.Commutative a => Data.Semigroup.Commutative.Commutative (Data.Semigroup.Internal.Dual a)
instance Data.Semigroup.Commutative.Commutative b => Data.Semigroup.Commutative.Commutative (a -> b)
instance (Data.Semigroup.Commutative.Commutative a, Data.Semigroup.Commutative.Commutative b) => Data.Semigroup.Commutative.Commutative (a, b)
instance (Data.Semigroup.Commutative.Commutative a, Data.Semigroup.Commutative.Commutative b, Data.Semigroup.Commutative.Commutative c) => Data.Semigroup.Commutative.Commutative (a, b, c)
instance (Data.Semigroup.Commutative.Commutative a, Data.Semigroup.Commutative.Commutative b, Data.Semigroup.Commutative.Commutative c, Data.Semigroup.Commutative.Commutative d) => Data.Semigroup.Commutative.Commutative (a, b, c, d)
instance (Data.Semigroup.Commutative.Commutative a, Data.Semigroup.Commutative.Commutative b, Data.Semigroup.Commutative.Commutative c, Data.Semigroup.Commutative.Commutative d, Data.Semigroup.Commutative.Commutative e) => Data.Semigroup.Commutative.Commutative (a, b, c, d, e)
instance GHC.Classes.Ord a => Data.Semigroup.Commutative.Commutative (Data.Set.Internal.Set a)
instance Data.Semigroup.Commutative.Commutative Data.IntSet.Internal.IntSet
instance Data.Semigroup.Commutative.Commutative a => Data.Semigroup.Commutative.Commutative (Data.Ord.Down a)
instance Data.Semigroup.Commutative.Commutative (Data.Proxy.Proxy x)
instance Data.Semigroup.Commutative.Commutative a => Data.Semigroup.Commutative.Commutative (Data.Functor.Const.Const a x)
instance Data.Semigroup.Commutative.Commutative a => Data.Semigroup.Commutative.Commutative (Data.Functor.Identity.Identity a)
instance (Data.Semigroup.Commutative.Commutative (f a), Data.Semigroup.Commutative.Commutative (g a)) => Data.Semigroup.Commutative.Commutative ((GHC.Generics.:*:) f g a)
instance Data.Semigroup.Commutative.Commutative (f (g a)) => Data.Semigroup.Commutative.Commutative ((GHC.Generics.:.:) f g a)
instance Data.Semigroup.Commutative.Commutative a => Data.Semigroup.Commutative.Commutative (Data.Functor.Contravariant.Op a b)
