-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Ring-like objects. -- -- Semirings, rings, division rings, modules, and algebras. @package rings @version 0.0.3 module Data.Semigroup.Multiplicative -- | Hyphenation operator. type ( g - f ) a = f (g a) infixr 1 - (*) :: (Multiplicative - Semigroup) a => a -> a -> a infixl 7 * (/) :: (Multiplicative - Group) a => a -> a -> a infixl 7 / one :: (Multiplicative - Monoid) a => a div :: (Multiplicative - Group) a => a -> a -> a newtype Multiplicative a Multiplicative :: a -> Multiplicative a [unMultiplicative] :: Multiplicative a -> a instance GHC.Base.Functor Data.Semigroup.Multiplicative.Multiplicative instance GHC.Show.Show a => GHC.Show.Show (Data.Semigroup.Multiplicative.Multiplicative a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semigroup.Multiplicative.Multiplicative a) instance GHC.Generics.Generic (Data.Semigroup.Multiplicative.Multiplicative a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semigroup.Multiplicative.Multiplicative a) instance GHC.Base.Applicative Data.Semigroup.Multiplicative.Multiplicative instance Data.Distributive.Distributive Data.Semigroup.Multiplicative.Multiplicative instance Data.Functor.Rep.Representable Data.Semigroup.Multiplicative.Multiplicative instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Int) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int8) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int16) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int32) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int64) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Integer.Type.Integer) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Word) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word8) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word16) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word32) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word64) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Natural.Natural) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Uni) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Deci) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Centi) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Milli) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Micro) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Nano) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Pico) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Float) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CFloat) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Double) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CDouble) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Int) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int8) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int16) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int32) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Int.Int64) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Integer.Type.Integer) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Word) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word8) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word16) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word32) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Word.Word64) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Natural.Natural) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Uni) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Deci) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Centi) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Milli) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Micro) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Nano) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Pico) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Float) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CFloat) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Double) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CDouble) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Uni) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Deci) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Centi) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Milli) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Micro) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Nano) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Pico) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Float) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CFloat) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Double) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Uni) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Deci) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Centi) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Milli) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Micro) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Nano) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Pico) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Float) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Double) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Uni) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Deci) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Centi) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Milli) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Micro) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Nano) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Pico) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Float) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Double) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Uni) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Deci) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Centi) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Milli) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Micro) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Nano) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Data.Fixed.Pico) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Float) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Double) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative Foreign.C.Types.CDouble) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative (GHC.Real.Ratio a)) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative ()) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative ()) instance Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative ()) instance Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative ()) instance Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative ()) instance Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative ()) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Bool) instance GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative GHC.Types.Bool) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semigroup.Internal.Dual a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semigroup.Internal.Dual a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Ord.Down a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Ord.Down a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semigroup.Max a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semigroup.Max a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (a, b)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup b => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (a -> b)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid b => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (a -> b)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (GHC.Maybe.Maybe a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (GHC.Maybe.Maybe a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Either.Either a b)) instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Map.Internal.Map k a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative Data.IntSet.Internal.IntSet) instance (GHC.Classes.Ord k, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid k, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Map.Internal.Map k a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.IntMap.Internal.IntMap a)) module Data.Semigroup.Additive (+) :: (Additive - Semigroup) a => a -> a -> a infixl 6 + (-) :: (Additive - Group) a => a -> a -> a infixl 6 - zero :: (Additive - Monoid) a => a -- | A commutative Semigroup under +. newtype Additive a Additive :: a -> Additive a [unAdditive] :: Additive a -> a instance GHC.Base.Functor Data.Semigroup.Additive.Additive instance GHC.Show.Show a => GHC.Show.Show (Data.Semigroup.Additive.Additive a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semigroup.Additive.Additive a) instance GHC.Generics.Generic (Data.Semigroup.Additive.Additive a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semigroup.Additive.Additive a) instance GHC.Base.Applicative Data.Semigroup.Additive.Additive instance Data.Distributive.Distributive Data.Semigroup.Additive.Additive instance Data.Functor.Rep.Representable Data.Semigroup.Additive.Additive instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Int) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Word) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word8) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word16) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word32) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word64) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Natural.Natural) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Float) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Double) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Int) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Word) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word8) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word16) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word32) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word64) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Natural.Natural) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Float) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Double) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Group.Group (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Group.Group (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative Data.Group.Group a) => Data.Magma.Magma (Data.Semigroup.Multiplicative.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative Data.Group.Group a) => Data.Group.Quasigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative Data.Group.Group a) => Data.Group.Loop (Data.Semigroup.Multiplicative.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative Data.Group.Group a) => Data.Group.Group (Data.Semigroup.Multiplicative.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => Data.Magma.Magma (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => Data.Group.Loop (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid a) => Data.Group.Group (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (a -> b)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid b => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (a -> b)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive [a]) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive [a]) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative [a]) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative [a]) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (GHC.Base.NonEmpty a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (GHC.Base.NonEmpty a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semigroup.Min a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semigroup.Min a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Ord.Down a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Ord.Down a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive ()) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive ()) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive ()) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive ()) instance Data.Group.Loop (Data.Semigroup.Additive.Additive ()) instance Data.Group.Group (Data.Semigroup.Additive.Additive ()) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Bool) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Bool) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (a, b)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (GHC.Maybe.Maybe a)) instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Either.Either a b)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (GHC.Maybe.Maybe a)) instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Map.Internal.Map k a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.IntSet.Internal.IntSet) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.IntSet.Internal.IntSet) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.IntMap.Internal.IntMap a)) instance GHC.Classes.Ord a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Map.Internal.Map k a)) module Data.Semigroup.Property module Data.Semiring -- | Hyphenation operator. type ( g - f ) a = f (g a) infixr 1 - zero :: (Additive - Monoid) a => a one :: (Multiplicative - Monoid) a => a two :: (Additive - Semigroup) a => (Multiplicative - Monoid) a => a (+) :: (Additive - Semigroup) a => a -> a -> a infixl 6 + (*) :: (Multiplicative - Semigroup) a => a -> a -> a infixl 7 * (-) :: (Additive - Group) a => a -> a -> a infixl 6 - (^) :: Semiring a => a -> Natural -> a infixr 8 ^ sum :: (Additive - Monoid) a => Presemiring a => Foldable f => f a -> a sum1 :: Presemiring a => Foldable1 f => f a -> a sumWith :: (Additive - Monoid) a => Presemiring a => Foldable t => (b -> a) -> t b -> a -- | Fold over a non-empty collection using the additive operation of an -- arbitrary semiring. -- --
--   >>> sumWith1 First $ (1 :| [2..5 :: Int]) * (1 :| [2..5 :: Int])
--   First {getFirst = 1}
--   
--   >>> sumWith1 First $ Nothing :| [Just (5 :: Int), Just 6,  Nothing]
--   First {getFirst = Nothing}
--   
--   >>> sumWith1 Just $ 1 :| [2..5 :: Int]
--   Just 15
--   
sumWith1 :: Foldable1 t => Presemiring a => (b -> a) -> t b -> a product :: (Multiplicative - Monoid) a => Presemiring a => Foldable f => f a -> a -- | The product of at a list of semiring elements (of length at least one) product1 :: Presemiring a => Foldable1 f => f a -> a -- | Fold over a collection using the multiplicative operation of an -- arbitrary semiring. -- --
--   product f == foldr' ((*) . f) one
--   
-- --
--   >>> productWith Just [1..5 :: Int]
--   Just 120
--   
productWith :: (Multiplicative - Monoid) a => Presemiring a => Foldable t => (b -> a) -> t b -> a -- | Fold over a non-empty collection using the multiplicative operation of -- a semiring. -- -- As the collection is non-empty this does not require a distinct -- multiplicative unit: -- --
--   >>> productWith1 Just $ 1 :| [2..5 :: Int]
--   Just 120
--   
--   >>> productWith1 First $ 1 :| [2..(5 :: Int)]
--   First {getFirst = 15}
--   
--   >>> productWith1 First $ Nothing :| [Just (5 :: Int), Just 6,  Nothing]
--   First {getFirst = Just 11}
--   
productWith1 :: Foldable1 t => Presemiring a => (b -> a) -> t b -> a -- | Cross-multiply two collections. -- --
--   >>> cross (V3 1 2 3) (V3 1 2 3)
--   14
--   
--   >>> cross [1,2,3 :: Int] [1,2,3]
--   36
--   
--   >>> cross [1,2,3 :: Int] []
--   0
--   
cross :: Foldable f => Applicative f => Presemiring a => (Additive - Monoid) a => f a -> f a -> a -- | Cross-multiply two non-empty collections. -- --
--   >>> cross1 (Right 2 :| [Left "oops"]) (Right 2 :| [Right 3]) :: Either [Char] Int
--   Right 4
--   
cross1 :: Foldable1 f => Apply f => Presemiring a => f a -> f a -> a -- | Evaluate a semiring expression. -- --
--   (a11 * .. * a1m) + (a21 * .. * a2n) + ...
--   
-- --
--   >>> eval [[1, 2], [3, 4 :: Int]] -- 1 * 2 + 3 * 4
--   14
--   
--   >>> eval $ sequence [[1, 2], [3, 4 :: Int]] -- 1 + 2 * 3 + 4
--   21
--   
eval :: Semiring a => Functor f => Foldable f => Foldable g => f (g a) -> a evalWith :: Semiring r => Functor f => Functor g => Foldable f => Foldable g => (a -> r) -> f (g a) -> r eval1 :: Presemiring a => Functor f => Foldable1 f => Foldable1 g => f (g a) -> a evalWith1 :: Presemiring r => Functor f => Functor g => Foldable1 f => Foldable1 g => (a -> r) -> f (g a) -> r negate :: (Additive - Group) a => a -> a -- | Absolute value of an element. -- --
--   abs r == mul r (signum r)
--   
-- -- https://en.wikipedia.org/wiki/Linearly_ordered_group abs :: (Additive - Group) a => Ord a => a -> a signum :: RingLaw a => Ord a => a -> a -- | Right pre-semirings. and (non-unital and unital) right semirings. -- -- A right pre-semiring (sometimes referred to as a bisemigroup) is a -- type R endowed with two associative binary (i.e. semigroup) -- operations: + and *, along with a right-distributivity -- property connecting them: -- -- Distributivity -- --
--   (a + b) * c == (a * c) + (b * c)
--   
-- -- Note that addition and multiplication needn't be commutative. -- -- See the properties module for a detailed specification of the laws. type PresemiringLaw a = ((Additive - Semigroup) a, (Multiplicative - Semigroup) a) class PresemiringLaw a => Presemiring a type SemiringLaw a = ((Additive - Monoid) a, (Multiplicative - Monoid) a) -- | Right semirings. -- -- A right semiring is a pre-semiring with two distinct neutral elements, -- zero and one, such that zero is right-neutral wrt -- addition, one is right-neutral wrt multiplication, and -- zero is right-annihilative wrt multiplication. -- -- Neutrality -- --
--   zero + r == r
--   one * r == r
--   
-- -- Absorbtion -- --
--   zero * a == zero
--   
class (Presemiring a, SemiringLaw a) => Semiring a type RingLaw a = ((Additive - Group) a, (Multiplicative - Monoid) a) -- | Rings. -- -- A ring R is a commutative group with a second monoidal -- operation * that distributes over +. -- -- The basic properties of a ring follow immediately from the axioms: -- --
--   r * zero == zero == zero * r
--   
-- --
--   negate one * r == negate r
--   
-- -- Furthermore, the binomial formula holds for any commuting pair of -- elements (that is, any a and b such that a * b = b * -- a). -- -- If zero = one in a ring R, then R has only one -- element, and is called the zero ring. Otherwise the additive identity, -- the additive inverse of each element, and the multiplicative identity -- are unique. -- -- See https://en.wikipedia.org/wiki/Ring_(mathematics). -- -- If the ring is ordered (i.e. has an Ord instance), then -- the following additional properties must hold: -- --
--   a <= b ==> a + c <= b + c
--   
-- --
--   zero <= a && zero <= b ==> zero <= a * b
--   
-- -- See the properties module for a detailed specification of the laws. class (Semiring a, RingLaw a) => Ring a -- | A commutative Semigroup under +. newtype Additive a Additive :: a -> Additive a [unAdditive] :: Additive a -> a newtype Multiplicative a Multiplicative :: a -> Multiplicative a [unMultiplicative] :: Multiplicative a -> a class Magma a (<<) :: Magma a => a -> a -> a infixl 6 << class Magma a => Quasigroup a (//) :: Quasigroup a => a -> a -> a (\\) :: Quasigroup a => a -> a -> a class Quasigroup a => Loop a lempty :: Loop a => a lreplicate :: Loop a => Natural -> a -> a class (Loop a, Monoid a) => Group a inv :: Group a => a -> a greplicate :: Group a => Integer -> a -> a -- | A generalization of replicate to an arbitrary Monoid. -- -- Adapted from -- http://augustss.blogspot.com/2008/07/lost-and-found-if-i-write-108-in.html. mreplicate :: Monoid a => Natural -> a -> a instance Data.Semiring.Ring a => Data.Semiring.Presemiring (Data.Complex.Complex a) instance Data.Semiring.Ring a => Data.Semiring.Semiring (Data.Complex.Complex a) instance Data.Semiring.Ring () instance Data.Semiring.Ring GHC.Types.Int instance Data.Semiring.Ring GHC.Int.Int8 instance Data.Semiring.Ring GHC.Int.Int16 instance Data.Semiring.Ring GHC.Int.Int32 instance Data.Semiring.Ring GHC.Int.Int64 instance Data.Semiring.Ring GHC.Integer.Type.Integer instance Data.Semiring.Ring (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semiring.Ring Data.Fixed.Uni instance Data.Semiring.Ring Data.Fixed.Deci instance Data.Semiring.Ring Data.Fixed.Centi instance Data.Semiring.Ring Data.Fixed.Milli instance Data.Semiring.Ring Data.Fixed.Micro instance Data.Semiring.Ring Data.Fixed.Nano instance Data.Semiring.Ring Data.Fixed.Pico instance Data.Semiring.Ring GHC.Types.Float instance Data.Semiring.Ring GHC.Types.Double instance Data.Semiring.Ring Foreign.C.Types.CFloat instance Data.Semiring.Ring Foreign.C.Types.CDouble instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Complex.Complex a) instance Data.Semiring.Semiring () instance Data.Semiring.Semiring GHC.Types.Bool instance Data.Semiring.Semiring GHC.Types.Word instance Data.Semiring.Semiring GHC.Word.Word8 instance Data.Semiring.Semiring GHC.Word.Word16 instance Data.Semiring.Semiring GHC.Word.Word32 instance Data.Semiring.Semiring GHC.Word.Word64 instance Data.Semiring.Semiring GHC.Natural.Natural instance Data.Semiring.Semiring (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semiring.Semiring GHC.Types.Int instance Data.Semiring.Semiring GHC.Int.Int8 instance Data.Semiring.Semiring GHC.Int.Int16 instance Data.Semiring.Semiring GHC.Int.Int32 instance Data.Semiring.Semiring GHC.Int.Int64 instance Data.Semiring.Semiring GHC.Integer.Type.Integer instance Data.Semiring.Semiring (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semiring.Semiring Data.Fixed.Uni instance Data.Semiring.Semiring Data.Fixed.Deci instance Data.Semiring.Semiring Data.Fixed.Centi instance Data.Semiring.Semiring Data.Fixed.Milli instance Data.Semiring.Semiring Data.Fixed.Micro instance Data.Semiring.Semiring Data.Fixed.Nano instance Data.Semiring.Semiring Data.Fixed.Pico instance Data.Semiring.Semiring GHC.Types.Float instance Data.Semiring.Semiring GHC.Types.Double instance Data.Semiring.Semiring Foreign.C.Types.CFloat instance Data.Semiring.Semiring Foreign.C.Types.CDouble instance Data.Semiring.Semiring a => Data.Semiring.Semiring (r -> a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (GHC.Maybe.Maybe a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semiring.Semiring [a] instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.IntMap.Internal.IntMap a) instance (GHC.Classes.Ord k, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Multiplicative.Multiplicative GHC.Base.Monoid k, Data.Semiring.Semiring a) => Data.Semiring.Semiring (Data.Map.Internal.Map k a) instance Data.Semiring.Presemiring () instance Data.Semiring.Presemiring GHC.Types.Bool instance Data.Semiring.Presemiring GHC.Types.Word instance Data.Semiring.Presemiring GHC.Word.Word8 instance Data.Semiring.Presemiring GHC.Word.Word16 instance Data.Semiring.Presemiring GHC.Word.Word32 instance Data.Semiring.Presemiring GHC.Word.Word64 instance Data.Semiring.Presemiring GHC.Natural.Natural instance Data.Semiring.Presemiring (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semiring.Presemiring GHC.Types.Int instance Data.Semiring.Presemiring GHC.Int.Int8 instance Data.Semiring.Presemiring GHC.Int.Int16 instance Data.Semiring.Presemiring GHC.Int.Int32 instance Data.Semiring.Presemiring GHC.Int.Int64 instance Data.Semiring.Presemiring GHC.Integer.Type.Integer instance Data.Semiring.Presemiring (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semiring.Presemiring Data.Fixed.Uni instance Data.Semiring.Presemiring Data.Fixed.Deci instance Data.Semiring.Presemiring Data.Fixed.Centi instance Data.Semiring.Presemiring Data.Fixed.Milli instance Data.Semiring.Presemiring Data.Fixed.Micro instance Data.Semiring.Presemiring Data.Fixed.Nano instance Data.Semiring.Presemiring Data.Fixed.Pico instance Data.Semiring.Presemiring GHC.Types.Float instance Data.Semiring.Presemiring GHC.Types.Double instance Data.Semiring.Presemiring Foreign.C.Types.CFloat instance Data.Semiring.Presemiring Foreign.C.Types.CDouble instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (r -> a) instance (Data.Semiring.Presemiring a, Data.Semiring.Presemiring b) => Data.Semiring.Presemiring (Data.Either.Either a b) instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (GHC.Maybe.Maybe a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => Data.Semiring.Presemiring [a] instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => Data.Semiring.Presemiring (GHC.Base.NonEmpty a) instance Data.Semiring.Presemiring Data.IntSet.Internal.IntSet instance GHC.Classes.Ord a => Data.Semiring.Presemiring (Data.Set.Internal.Set a) instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (Data.IntMap.Internal.IntMap a) instance (GHC.Classes.Ord k, Data.Semiring.Presemiring a) => Data.Semiring.Presemiring (Data.Map.Internal.Map k a) module Data.Semifield (/) :: (Multiplicative - Group) a => a -> a -> a infixl 7 / (^^) :: (Multiplicative - Group) a => a -> Integer -> a infixr 8 ^^ -- | Take the reciprocal of a multiplicative group element. -- --
--   >>> recip (3 :+ 4) :: Complex Rational
--   3 % 25 :+ (-4) % 25
--   
--   >>> recip (3 :+ 4) :: Complex Double
--   0.12 :+ (-0.16)
--   
--   >>> recip (3 :+ 4) :: Complex Pico
--   0.120000000000 :+ -0.160000000000
--   
recip :: (Multiplicative - Group) a => a -> a anan :: Semifield a => a pinf :: Semifield a => a ninf :: Field a => a type SemifieldLaw a = ((Additive - Monoid) a, (Multiplicative - Group) a) -- | A semifield, near-field, division ring, or associative division -- algebra. -- -- Instances needn't have commutative multiplication or additive -- inverses. -- -- See also the wikipedia definitions of semifield, -- near-field, division ring, and division algebra. class (Semiring a, SemifieldLaw a) => Semifield a type FieldLaw a = ((Additive - Group) a, (Multiplicative - Group) a) class (Ring a, Semifield a, FieldLaw a) => Field a instance Data.Semifield.Field a => Data.Semifield.Semifield (Data.Complex.Complex a) instance Data.Semifield.Field () instance Data.Semifield.Field GHC.Real.Rational instance Data.Semifield.Field Data.Fixed.Uni instance Data.Semifield.Field Data.Fixed.Deci instance Data.Semifield.Field Data.Fixed.Centi instance Data.Semifield.Field Data.Fixed.Milli instance Data.Semifield.Field Data.Fixed.Micro instance Data.Semifield.Field Data.Fixed.Nano instance Data.Semifield.Field Data.Fixed.Pico instance Data.Semifield.Field GHC.Types.Float instance Data.Semifield.Field GHC.Types.Double instance Data.Semifield.Field Foreign.C.Types.CFloat instance Data.Semifield.Field Foreign.C.Types.CDouble instance Data.Semifield.Field a => Data.Semifield.Field (Data.Complex.Complex a) instance Data.Semifield.Semifield () instance Data.Semifield.Semifield (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semifield.Semifield GHC.Real.Rational instance Data.Semifield.Semifield Data.Fixed.Uni instance Data.Semifield.Semifield Data.Fixed.Deci instance Data.Semifield.Semifield Data.Fixed.Centi instance Data.Semifield.Semifield Data.Fixed.Milli instance Data.Semifield.Semifield Data.Fixed.Micro instance Data.Semifield.Semifield Data.Fixed.Nano instance Data.Semifield.Semifield Data.Fixed.Pico instance Data.Semifield.Semifield GHC.Types.Float instance Data.Semifield.Semifield GHC.Types.Double instance Data.Semifield.Semifield Foreign.C.Types.CFloat instance Data.Semifield.Semifield Foreign.C.Types.CDouble module Data.Semimodule type Free f = (Representable f, Eq (Rep f)) type Basis b f = (Free f, Rep f ~ b) type Module r a = (Ring r, Group a, Semimodule r a) -- | Semimodule over a commutative semiring. -- -- All instances must satisfy the following identities: -- --
--   r *. (x <> y) == r *. x <> r *. y
--   
-- --
--   (r + s) *. x == r *. x <> s *. x
--   
-- --
--   (r * s) *. x == r *. (s *. x)
--   
-- -- When the ring of coefficients r is unital we must additionally -- have: -- --
--   one *. x == x
--   
-- -- See the properties module for a detailed specification of the laws. class (Semiring r, Semigroup a) => Semimodule r a -- | Left-multiply by a scalar. (*.) :: Semimodule r a => r -> a -> a -- | Right-multiply by a scalar. (.*) :: Semimodule r a => a -> r -> a infixl 7 .* infixl 7 *. -- | Default definition of '(*.)' for a free module. multl :: Semiring a => Functor f => a -> f a -> f a -- | Default definition of '(.*)' for a free module. multr :: Semiring a => Functor f => f a -> a -> f a -- | Default definition of << for a commutative group. negateDef :: Semimodule Integer a => a -> a -- | Linearly interpolate between two vectors. -- --
--   >>> u = V3 (1 :% 1) (2 :% 1) (3 :% 1) :: V3 Rational
--   
--   >>> v = V3 (2 :% 1) (4 :% 1) (6 :% 1) :: V3 Rational
--   
--   >>> r = 1 :% 2 :: Rational
--   
--   >>> lerp r u v
--   V3 (6 % 4) (12 % 4) (18 % 4)
--   
lerp :: Module r a => r -> a -> a -> a -- | Dot product. -- --
--   >>> V3 1 2 3 .*. V3 1 2 3
--   14
--   
(.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a infix 6 .*. -- | Squared l2 norm of a vector. quadrance :: Free f => Foldable f => Semiring a => f a -> a -- | Squared l2 norm of the difference between two vectors. qd :: Free f => Foldable f => Module a (f a) => f a -> f a -> a -- | Dirac delta function. dirac :: Eq i => Semiring a => i -> i -> a -- | Create a unit vector at an index. -- --
--   >>> idx I21 :: V2 Int
--   V2 1 0
--   
-- --
--   >>> idx I42 :: V4 Int
--   V4 0 1 0 0
--   
idx :: Free f => Semiring a => Rep f -> f a instance Data.Semiring.Semiring r => Data.Semimodule.Semimodule r () instance GHC.Base.Semigroup a => Data.Semimodule.Semimodule () a instance GHC.Base.Monoid a => Data.Semimodule.Semimodule GHC.Natural.Natural a instance Data.Group.Group a => Data.Semimodule.Semimodule GHC.Integer.Type.Integer a instance Data.Semimodule.Semimodule r a => Data.Semimodule.Semimodule r (e -> a) instance (Data.Semimodule.Semimodule r a, Data.Semimodule.Semimodule r b) => Data.Semimodule.Semimodule r (a, b) instance (Data.Semimodule.Semimodule r a, Data.Semimodule.Semimodule r b, Data.Semimodule.Semimodule r c) => Data.Semimodule.Semimodule r (a, b, c) instance (Data.Semiring.Semiring a, Data.Semimodule.Semimodule r a) => Data.Semimodule.Semimodule r (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance (Data.Semiring.Ring a, Data.Semimodule.Semimodule r a) => Data.Semimodule.Semimodule r (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance Data.Semiring.Semiring GHC.Types.Bool => Data.Semimodule.Semimodule GHC.Types.Bool (Data.Semigroup.Additive.Additive GHC.Types.Bool) instance Data.Semiring.Semiring GHC.Types.Int => Data.Semimodule.Semimodule GHC.Types.Int (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Semiring.Semiring GHC.Int.Int8 => Data.Semimodule.Semimodule GHC.Int.Int8 (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Semiring.Semiring GHC.Int.Int16 => Data.Semimodule.Semimodule GHC.Int.Int16 (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Semiring.Semiring GHC.Int.Int32 => Data.Semimodule.Semimodule GHC.Int.Int32 (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Semiring.Semiring GHC.Int.Int64 => Data.Semimodule.Semimodule GHC.Int.Int64 (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Semiring.Semiring GHC.Types.Word => Data.Semimodule.Semimodule GHC.Types.Word (Data.Semigroup.Additive.Additive GHC.Types.Word) instance Data.Semiring.Semiring GHC.Word.Word8 => Data.Semimodule.Semimodule GHC.Word.Word8 (Data.Semigroup.Additive.Additive GHC.Word.Word8) instance Data.Semiring.Semiring GHC.Word.Word16 => Data.Semimodule.Semimodule GHC.Word.Word16 (Data.Semigroup.Additive.Additive GHC.Word.Word16) instance Data.Semiring.Semiring GHC.Word.Word32 => Data.Semimodule.Semimodule GHC.Word.Word32 (Data.Semigroup.Additive.Additive GHC.Word.Word32) instance Data.Semiring.Semiring GHC.Word.Word64 => Data.Semimodule.Semimodule GHC.Word.Word64 (Data.Semigroup.Additive.Additive GHC.Word.Word64) instance Data.Semiring.Semiring Data.Fixed.Uni => Data.Semimodule.Semimodule Data.Fixed.Uni (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Semiring.Semiring Data.Fixed.Deci => Data.Semimodule.Semimodule Data.Fixed.Deci (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Semiring.Semiring Data.Fixed.Centi => Data.Semimodule.Semimodule Data.Fixed.Centi (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Semiring.Semiring Data.Fixed.Milli => Data.Semimodule.Semimodule Data.Fixed.Milli (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Semiring.Semiring Data.Fixed.Micro => Data.Semimodule.Semimodule Data.Fixed.Micro (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Semiring.Semiring Data.Fixed.Nano => Data.Semimodule.Semimodule Data.Fixed.Nano (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Semiring.Semiring Data.Fixed.Pico => Data.Semimodule.Semimodule Data.Fixed.Pico (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Semiring.Semiring GHC.Types.Float => Data.Semimodule.Semimodule GHC.Types.Float (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Semiring.Semiring GHC.Types.Double => Data.Semimodule.Semimodule GHC.Types.Double (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Semiring.Semiring Foreign.C.Types.CFloat => Data.Semimodule.Semimodule Foreign.C.Types.CFloat (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Semiring.Semiring Foreign.C.Types.CDouble => Data.Semimodule.Semimodule Foreign.C.Types.CDouble (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) module Data.Semimodule.Transform -- | A binary relation between two basis indices. -- -- Index b c relations correspond to (compositions of) -- permutation, projection, and embedding transformations. -- -- See also https://en.wikipedia.org/wiki/Logical_matrix. type Index b c = forall a. Tran a b c -- | A general linear transformation between free semimodules indexed with -- bases b and c. newtype Tran a b c Tran :: ((c -> a) -> b -> a) -> Tran a b c [runTran] :: Tran a b c -> (c -> a) -> b -> a app :: Basis b f => Basis c g => Tran a b c -> g a -> f a -- | Tran a b c is an invariant functor on a. -- -- See also http://comonad.com/reader/2008/rotten-bananas/. invmap :: (a1 -> a2) -> (a2 -> a1) -> Tran a1 b c -> Tran a2 b c -- | An endomorphism over a free semimodule. type Endo a b = Tran a b b -- | Obtain a matrix by stacking rows. -- --
--   >>> rows (V2 1 2) :: M22 Int
--   V2 (V2 1 2) (V2 1 2)
--   
rows :: Free f => Free g => g a -> f (g a) -- | Obtain a matrix by stacking columns. -- --
--   >>> cols (V2 1 2) :: M22 Int
--   V2 (V2 1 1) (V2 2 2)
--   
cols :: Free f => Free g => f a -> f (g a) projl :: Free f => Free g => Product f g a -> f a projr :: Free f => Free g => Product f g a -> g a -- | Left (post) composition with a linear transformation. compl :: Basis b f1 => Basis c f2 => Free g => Index b c -> f2 (g a) -> f1 (g a) -- | Right (pre) composition with a linear transformation. compr :: Basis b g1 => Basis c g2 => Free f => Index b c -> f (g2 a) -> f (g1 a) -- | Left and right composition with a linear transformation. -- --
--   'complr f g' = 'compl f' . 'compr g'
--   
-- -- When f . g = id this induces a similarity transformation: -- --
--   >>> perm1 = arr (+ I32)
--   
--   >>> perm2 = arr (+ I33)
--   
--   >>> m = m33 1 2 3 4 5 6 7 8 9 :: M33 Int
--   
--   >>> conjugate perm1 perm2 m :: M33 Int
--   V3 (V3 5 6 4) (V3 8 9 7) (V3 2 3 1)
--   
-- -- See also https://en.wikipedia.org/wiki/Matrix_similarity & -- https://en.wikipedia.org/wiki/Conjugacy_class. complr :: Basis b1 f1 => Basis c1 f2 => Basis b2 g1 => Basis c2 g2 => Index b1 c1 -> Index b2 c2 -> f2 (g2 a) -> f1 (g1 a) -- | Transpose a matrix. -- --
--   >>> transpose (V3 (V2 1 2) (V2 3 4) (V2 5 6))
--   V2 (V3 1 3 5) (V3 2 4 6)
--   
-- --
--   >>> transpose $ m23 1 2 3 4 5 6 :: M32 Int
--   V3 (V2 1 4) (V2 2 5) (V2 3 6)
--   
transpose :: Free f => Free g => f (g a) -> g (f a) arr :: (b -> c) -> Index b c in1 :: Index (a, b) b in2 :: Index (a, b) a exl :: Index a (a + b) exr :: Index b (a + b) braid :: Index (a, b) (b, a) ebraid :: Index (a + b) (b + a) first :: Index b c -> Index (b, d) (c, d) second :: Index b c -> Index (d, b) (d, c) left :: Index b c -> Index (b + d) (c + d) right :: Index b c -> Index (d + b) (d + c) (***) :: Index a1 b1 -> Index a2 b2 -> Index (a1, a2) (b1, b2) infixr 3 *** (+++) :: Index a1 b1 -> Index a2 b2 -> Index (a1 + a2) (b1 + b2) infixr 2 +++ (&&&) :: Index a b1 -> Index a b2 -> Index a (b1, b2) infixr 3 &&& (|||) :: Index a1 b -> Index a2 b -> Index (a1 + a2) b infixr 2 ||| ($$$) :: Index a (b -> c) -> Index a b -> Index a c infixr 0 $$$ adivide :: (a -> (a1, a2)) -> Index a1 b -> Index a2 b -> Index a b adivide' :: Index a b -> Index a b -> Index a b adivided :: Index a1 b -> Index a2 b -> Index (a1, a2) b aselect :: ((b1 + b2) -> b) -> Index a b1 -> Index a b2 -> Index a b aselect' :: Index a b -> Index a b -> Index a b aselected :: Index a b1 -> Index a b2 -> Index a (b1 + b2) instance GHC.Base.Functor (Data.Semimodule.Transform.Tran a b) instance Control.Category.Category (Data.Semimodule.Transform.Tran a) instance Data.Profunctor.Unsafe.Profunctor (Data.Semimodule.Transform.Tran a) module Data.Algebra -- | Multiplication operator on a free algebra. -- -- In particular this is cross product on the I3 basis in -- R^3: -- --
--   >>> V3 1 0 0 >< V3 0 1 0 >< V3 0 1 0 :: V3 Int
--   V3 (-1) 0 0
--   
--   >>> V3 1 0 0 >< (V3 0 1 0 >< V3 0 1 0) :: V3 Int
--   V3 0 0 0
--   
-- -- Caution in general (><) needn't be commutative, nor even -- associative. -- -- The cross product in particular satisfies the following properties: -- --
--   a >< a = mempty
--   a >< b = negate ( b >< a ) , 
--   a >< ( b <> c ) = ( a >< b ) <> ( a >< c ) , 
--   ( r a ) >< b = a >< ( r b ) = r ( a >< b ) . 
--   a >< ( b >< c ) <> b >< ( c >< a ) <> c >< ( a >< b ) = mempty . 
--   
-- -- See Jacobi identity. -- -- For associative algebras, use (*) instead for clarity: -- --
--   >>> (1 :+ 2) >< (3 :+ 4) :: Complex Int
--   (-5) :+ 10
--   
--   >>> (1 :+ 2) * (3 :+ 4) :: Complex Int
--   (-5) :+ 10
--   
--   >>> qi >< qj :: QuatM
--   Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)
--   
--   >>> qi * qj :: QuatM
--   Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)
--   
(><) :: (Representable f, Algebra r (Rep f)) => f r -> f r -> f r infixl 7 >< -- | Division operator on a free division algebra. -- --
--   >>> (1 :+ 0) // (0 :+ 1)
--   0.0 :+ (-1.0)
--   
(//) :: Representable f => Division r (Rep f) => f r -> f r -> f r infixl 7 // -- | Bilinear form on a free composition algebra. -- --
--   >>> V2 1 2 .@. V2 1 2
--   5.0
--   
--   >>> V2 1 2 .@. V2 2 (-1)
--   0.0
--   
--   >>> V3 1 1 1 .@. V3 1 1 (-2)
--   0.0
--   
-- --
--   >>> (1 :+ 2) .@. (2 :+ (-1)) :: Double
--   0.0
--   
-- --
--   >>> qi .@. qj :: Double
--   0.0
--   
--   >>> qj .@. qk :: Double
--   0.0
--   
--   >>> qk .@. qi :: Double
--   0.0
--   
--   >>> qk .@. qk :: Double
--   1.0
--   
(.@.) :: Representable f => Composition a (Rep f) => Semigroup (f a) => Field a => f a -> f a -> a infix 6 .@. -- | Unit of a unital algebra. -- --
--   >>> unit :: Complex Int
--   1 :+ 0
--   
--   >>> unit :: QuatD
--   Quaternion 1.0 (V3 0.0 0.0 0.0)
--   
unit :: Representable f => Unital r (Rep f) => f r -- | Norm of a composition algebra. -- --
--   norm x * norm y = norm (x >< y)
--   norm . norm' $ x = norm x * norm x
--   
norm :: (Representable f, Composition r (Rep f)) => f r -> r conj :: Representable f => Composition r (Rep f) => f r -> f r -- | Scalar triple product. -- --
--   triple x y z = triple z x y = triple y z x
--   triple x y z = negate $ triple x z y = negate $ triple y x z
--   triple x x y = triple x y y = triple x y x = zero
--   (triple x y z) *. x = (x >< y) >< (x >< z)
--   
-- --
--   >>> triple (V3 0 0 1) (V3 1 0 0) (V3 0 1 0) :: Double
--   1.0
--   
triple :: Free f => Foldable f => Algebra a (Rep f) => f a -> f a -> f a -> a -- |
--   reciprocal x = (/ quadrance x) <$> conj x
--   
reciprocal :: Representable f => Division a (Rep f) => f a -> f a -- | Algebra over a semiring. -- -- Needn't be associative or unital. class Semiring r => Algebra r a multiplyWith :: Algebra r a => (a -> a -> r) -> a -> r -- | Composition algebra over a free semimodule. class Algebra r a => Composition r a conjugateWith :: Composition r a => (a -> r) -> a -> r normWith :: Composition r a => (a -> r) -> r class (Semiring r, Algebra r a) => Unital r a unitWith :: Unital r a => r -> a -> r -- | A (not necessarily associative) division algebra. class (Semifield r, Unital r a) => Division r a reciprocalWith :: Division r a => (a -> r) -> a -> r instance Data.Semiring.Ring r => Data.Algebra.Algebra r Data.Algebra.ComplexBasis instance Data.Semiring.Ring r => Data.Algebra.Composition r Data.Algebra.ComplexBasis instance Data.Semiring.Ring r => Data.Algebra.Unital r Data.Algebra.ComplexBasis instance Data.Semifield.Field r => Data.Algebra.Division r Data.Algebra.ComplexBasis instance Data.Semiring.Semiring r => Data.Algebra.Unital r () instance (Data.Algebra.Unital r a, Data.Algebra.Unital r b) => Data.Algebra.Unital r (a, b) instance (Data.Algebra.Unital r a, Data.Algebra.Unital r b, Data.Algebra.Unital r c) => Data.Algebra.Unital r (a, b, c) instance Data.Semiring.Semiring r => Data.Algebra.Unital r [a] instance Data.Semiring.Semiring r => Data.Algebra.Algebra r () instance (Data.Algebra.Algebra r a, Data.Algebra.Algebra r b) => Data.Algebra.Algebra r (a, b) instance (Data.Algebra.Algebra r a, Data.Algebra.Algebra r b, Data.Algebra.Algebra r c) => Data.Algebra.Algebra r (a, b, c) instance Data.Semiring.Semiring r => Data.Algebra.Algebra r [a] module Data.Semimodule.Vector type Basis b f = (Free f, Rep f ~ b) -- | Left-multiply by a scalar. (*.) :: Semimodule r a => r -> a -> a infixl 7 *. -- | Right-multiply by a scalar. (.*) :: Semimodule r a => a -> r -> a infixl 7 .* -- | Dot product. -- --
--   >>> V3 1 2 3 .*. V3 1 2 3
--   14
--   
(.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a infix 6 .*. -- | Multiplication operator on a free algebra. -- -- In particular this is cross product on the I3 basis in -- R^3: -- --
--   >>> V3 1 0 0 >< V3 0 1 0 >< V3 0 1 0 :: V3 Int
--   V3 (-1) 0 0
--   
--   >>> V3 1 0 0 >< (V3 0 1 0 >< V3 0 1 0) :: V3 Int
--   V3 0 0 0
--   
-- -- Caution in general (><) needn't be commutative, nor even -- associative. -- -- The cross product in particular satisfies the following properties: -- --
--   a >< a = mempty
--   a >< b = negate ( b >< a ) , 
--   a >< ( b <> c ) = ( a >< b ) <> ( a >< c ) , 
--   ( r a ) >< b = a >< ( r b ) = r ( a >< b ) . 
--   a >< ( b >< c ) <> b >< ( c >< a ) <> c >< ( a >< b ) = mempty . 
--   
-- -- See Jacobi identity. -- -- For associative algebras, use (*) instead for clarity: -- --
--   >>> (1 :+ 2) >< (3 :+ 4) :: Complex Int
--   (-5) :+ 10
--   
--   >>> (1 :+ 2) * (3 :+ 4) :: Complex Int
--   (-5) :+ 10
--   
--   >>> qi >< qj :: QuatM
--   Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)
--   
--   >>> qi * qj :: QuatM
--   Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)
--   
(><) :: (Representable f, Algebra r (Rep f)) => f r -> f r -> f r infixl 7 >< -- | Scalar triple product. -- --
--   triple x y z = triple z x y = triple y z x
--   triple x y z = negate $ triple x z y = negate $ triple y x z
--   triple x x y = triple x y y = triple x y x = zero
--   (triple x y z) *. x = (x >< y) >< (x >< z)
--   
-- --
--   >>> triple (V3 0 0 1) (V3 1 0 0) (V3 0 1 0) :: Double
--   1.0
--   
triple :: Free f => Foldable f => Algebra a (Rep f) => f a -> f a -> f a -> a -- | Linearly interpolate between two vectors. -- --
--   >>> u = V3 (1 :% 1) (2 :% 1) (3 :% 1) :: V3 Rational
--   
--   >>> v = V3 (2 :% 1) (4 :% 1) (6 :% 1) :: V3 Rational
--   
--   >>> r = 1 :% 2 :: Rational
--   
--   >>> lerp r u v
--   V3 (6 % 4) (12 % 4) (18 % 4)
--   
lerp :: Module r a => r -> a -> a -> a -- | Squared l2 norm of a vector. quadrance :: Free f => Foldable f => Semiring a => f a -> a -- | Squared l2 norm of the difference between two vectors. qd :: Free f => Foldable f => Module a (f a) => f a -> f a -> a -- | Dirac delta function. dirac :: Eq i => Semiring a => i -> i -> a data I4 I41 :: I4 I42 :: I4 I43 :: I4 I44 :: I4 data V4 a V4 :: !a -> !a -> !a -> !a -> V4 a type QuaternionBasis = Maybe I3 data I3 I31 :: I3 I32 :: I3 I33 :: I3 data V3 a V3 :: !a -> !a -> !a -> V3 a data I2 I21 :: I2 I22 :: I2 data V2 a V2 :: !a -> !a -> V2 a i2 :: a -> a -> I2 -> a fillI2 :: Basis I2 f => a -> a -> f a i3 :: a -> a -> a -> I3 -> a fillI3 :: Basis I3 f => a -> a -> a -> f a i4 :: a -> a -> a -> a -> I4 -> a fillI4 :: Basis I4 f => a -> a -> a -> a -> f a instance GHC.Show.Show Data.Semimodule.Vector.I4 instance GHC.Classes.Ord Data.Semimodule.Vector.I4 instance GHC.Classes.Eq Data.Semimodule.Vector.I4 instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Vector.V4 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Vector.V4 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Vector.V4 a) instance GHC.Show.Show Data.Semimodule.Vector.I3 instance GHC.Classes.Ord Data.Semimodule.Vector.I3 instance GHC.Classes.Eq Data.Semimodule.Vector.I3 instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Vector.V3 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Vector.V3 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Vector.V3 a) instance GHC.Show.Show Data.Semimodule.Vector.I2 instance GHC.Classes.Ord Data.Semimodule.Vector.I2 instance GHC.Classes.Eq Data.Semimodule.Vector.I2 instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Vector.V2 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Vector.V2 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Vector.V2 a) instance Data.Functor.Rep.Representable Data.Semimodule.Vector.V4 instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semimodule.Vector.V4 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semimodule.Vector.V4 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semimodule.Vector.V4 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semimodule.Vector.V4 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semimodule.Vector.V4 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semimodule.Vector.V4 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a)) instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Semimodule.Vector.V4 a) instance GHC.Base.Functor Data.Semimodule.Vector.V4 instance GHC.Base.Applicative Data.Semimodule.Vector.V4 instance Data.Foldable.Foldable Data.Semimodule.Vector.V4 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Vector.V4 instance Data.Distributive.Distributive Data.Semimodule.Vector.V4 instance Data.Semiring.Ring r => Data.Algebra.Algebra r Data.Semimodule.Vector.QuaternionBasis instance Data.Semiring.Ring r => Data.Algebra.Unital r Data.Semimodule.Vector.QuaternionBasis instance Data.Semiring.Ring r => Data.Algebra.Composition r Data.Semimodule.Vector.QuaternionBasis instance Data.Semifield.Field r => Data.Algebra.Division r Data.Semimodule.Vector.QuaternionBasis instance Data.Functor.Rep.Representable Data.Semimodule.Vector.V3 instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I3) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I3) instance Data.Semiring.Ring r => Data.Algebra.Algebra r Data.Semimodule.Vector.I3 instance Data.Semiring.Ring r => Data.Algebra.Composition r Data.Semimodule.Vector.I3 instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semimodule.Vector.V3 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semimodule.Vector.V3 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semimodule.Vector.V3 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semimodule.Vector.V3 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semimodule.Vector.V3 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semimodule.Vector.V3 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a)) instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Semimodule.Vector.V3 a) instance GHC.Base.Functor Data.Semimodule.Vector.V3 instance GHC.Base.Applicative Data.Semimodule.Vector.V3 instance Data.Foldable.Foldable Data.Semimodule.Vector.V3 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Vector.V3 instance Data.Distributive.Distributive Data.Semimodule.Vector.V3 instance Data.Functor.Rep.Representable Data.Semimodule.Vector.V2 instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I2) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I2) instance Data.Semiring.Semiring r => Data.Algebra.Algebra r Data.Semimodule.Vector.I2 instance Data.Semiring.Semiring r => Data.Algebra.Composition r Data.Semimodule.Vector.I2 instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semimodule.Vector.V2 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semimodule.Vector.V2 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semimodule.Vector.V2 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semimodule.Vector.V2 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semimodule.Vector.V2 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semimodule.Vector.V2 a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a)) instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Semimodule.Vector.V2 a) instance GHC.Base.Functor Data.Semimodule.Vector.V2 instance GHC.Base.Applicative Data.Semimodule.Vector.V2 instance Data.Foldable.Foldable Data.Semimodule.Vector.V2 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Vector.V2 instance Data.Distributive.Distributive Data.Semimodule.Vector.V2 module Data.Semimodule.Matrix -- | A 2x2 matrix. type M22 a = V2 (V2 a) -- | A 2x3 matrix. type M23 a = V2 (V3 a) -- | A 2x4 matrix. type M24 a = V2 (V4 a) -- | A 3x2 matrix. type M32 a = V3 (V2 a) -- | A 3x3 matrix. type M33 a = V3 (V3 a) -- | A 3x4 matrix. type M34 a = V3 (V4 a) -- | A 4x2 matrix. type M42 a = V4 (V2 a) -- | A 4x3 matrix. type M43 a = V4 (V3 a) -- | A 4x4 matrix. type M44 a = V4 (V4 a) lensRep :: Eq (Rep f) => Representable f => Rep f -> forall g. Functor g => (a -> g a) -> f a -> g (f a) grateRep :: Representable f => forall g. Functor g => (Rep f -> g a -> b) -> g (f a) -> f b tran :: Semiring a => Basis b f => Basis c g => Foldable g => f (g a) -> Tran a b c -- | Retrieve a row of a row-major matrix or element of a row vector. -- --
--   >>> row I21 (V2 1 2)
--   1
--   
row :: Representable f => Rep f -> f a -> a -- | Obtain a matrix by stacking rows. -- --
--   >>> rows (V2 1 2) :: M22 Int
--   V2 (V2 1 2) (V2 1 2)
--   
rows :: Free f => Free g => g a -> f (g a) -- | Retrieve a column of a row-major matrix. -- --
--   >>> row I22 . col I31 $ V2 (V3 1 2 3) (V3 4 5 6)
--   4
--   
col :: Functor f => Representable g => Rep g -> f (g a) -> f a -- | Obtain a matrix by stacking columns. -- --
--   >>> cols (V2 1 2) :: M22 Int
--   V2 (V2 1 1) (V2 2 2)
--   
cols :: Free f => Free g => f a -> f (g a) -- | Multiply a matrix on the right by a column vector. -- --
--   (.#) = app . fromMatrix
--   
-- --
--   >>> m23 1 2 3 4 5 6 .# V3 7 8 9
--   V2 50 122
--   
-- --
--   >>> m22 1 0 0 0 .# m23 1 2 3 4 5 6 .# V3 7 8 9
--   V2 50 0
--   
(.#) :: (Semiring a, Free f, Free g, Foldable g) => f (g a) -> g a -> f a infixr 7 .# -- | Right-multiply by a scalar. (.*) :: Semimodule r a => a -> r -> a infixl 7 .* -- | Multiply a matrix on the left by a row vector. -- --
--   >>> V2 1 2 #. m23 3 4 5 6 7 8
--   V3 15 18 21
--   
-- --
--   >>> V2 1 2 #. m23 3 4 5 6 7 8 #. m32 1 0 0 0 0 0
--   V2 15 0
--   
(#.) :: (Semiring a, Free f, Foldable f, Free g) => f a -> f (g a) -> g a infixl 7 #. -- | Left-multiply by a scalar. (*.) :: Semimodule r a => r -> a -> a infixl 7 *. -- | Multiply two matrices. -- --
--   >>> m22 1 2 3 4 .#. m22 1 2 3 4 :: M22 Int
--   V2 (V2 7 10) (V2 15 22)
--   
-- --
--   >>> m23 1 2 3 4 5 6 .#. m32 1 2 3 4 4 5 :: M22 Int
--   V2 (V2 19 25) (V2 43 58)
--   
(.#.) :: (Semiring a, Free f, Free g, Free h, Foldable g) => f (g a) -> g (h a) -> f (h a) infixr 7 .#. -- | Dot product. -- --
--   >>> V3 1 2 3 .*. V3 1 2 3
--   14
--   
(.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a infix 6 .*. -- | Outer product of two vectors. -- --
--   >>> V2 1 1 `outer` V2 1 1
--   V2 (V2 1 1) (V2 1 1)
--   
outer :: Semiring a => Functor f => Functor g => f a -> g a -> f (g a) -- | Obtain a diagonal matrix from a vector. -- --
--   >>> scale (V2 2 3)
--   V2 (V2 2 0) (V2 0 3)
--   
scale :: (Additive - Monoid) a => Free f => f a -> f (f a) -- | Dirac delta function. dirac :: Eq i => Semiring a => i -> i -> a -- | Identity matrix. -- --
--   >>> identity :: M44 Int
--   V4 (V4 1 0 0 0) (V4 0 1 0 0) (V4 0 0 1 0) (V4 0 0 0 1)
--   
-- --
--   >>> identity :: V3 (V3 Int)
--   V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)
--   
identity :: Semiring a => Free f => f (f a) -- | Transpose a matrix. -- --
--   >>> transpose (V3 (V2 1 2) (V2 3 4) (V2 5 6))
--   V2 (V3 1 3 5) (V3 2 4 6)
--   
-- --
--   >>> transpose $ m23 1 2 3 4 5 6 :: M32 Int
--   V3 (V2 1 4) (V2 2 5) (V2 3 6)
--   
transpose :: Free f => Free g => f (g a) -> g (f a) -- | Compute the trace of a matrix. -- --
--   >>> trace (V2 (V2 a b) (V2 c d))
--   a <> d
--   
trace :: Semiring a => Free f => Foldable f => f (f a) -> a -- | Obtain the diagonal of a matrix as a vector. -- --
--   >>> diagonal (V2 (V2 a b) (V2 c d))
--   V2 a d
--   
diagonal :: Representable f => f (f a) -> f a -- | 2x2 matrix bdeterminant over a commutative semiring. -- --
--   >>> bdet2 $ m22 1 2 3 4
--   (4,6)
--   
bdet2 :: Semiring a => Basis I2 f => Basis I2 g => f (g a) -> (a, a) -- | 2x2 matrix determinant over a commutative ring. -- --
--   det2 == uncurry (-) . bdet2
--   
-- --
--   >>> det2 $ m22 1 2 3 4 :: Double
--   -2.0
--   
det2 :: Ring a => Basis I2 f => Basis I2 g => f (g a) -> a -- | 2x2 matrix inverse over a field. -- --
--   >>> inv2 $ m22 1 2 3 4 :: M22 Double
--   V2 (V2 (-2.0) 1.0) (V2 1.5 (-0.5))
--   
inv2 :: Field a => Basis I2 f => Basis I2 g => f (g a) -> g (f a) -- | 3x3 matrix bdeterminant over a commutative semiring. -- --
--   >>> bdet3 (V3 (V3 1 2 3) (V3 4 5 6) (V3 7 8 9))
--   (225, 225)
--   
bdet3 :: Semiring a => Basis I3 f => Basis I3 g => f (g a) -> (a, a) -- | 3x3 double-precision matrix determinant. -- --
--   det3 == uncurry (-) . bdet3
--   
-- -- Implementation uses a cofactor expansion to avoid loss of precision. -- --
--   >>> det3 (V3 (V3 1 2 3) (V3 4 5 6) (V3 7 8 9))
--   0
--   
det3 :: Ring a => Basis I3 f => Basis I3 g => f (g a) -> a -- | 3x3 matrix inverse. -- --
--   >>> inv3 $ m33 1 2 4 4 2 2 1 1 1 :: M33 Double
--   V3 (V3 0.0 0.5 (-1.0)) (V3 (-0.5) (-0.75) 3.5) (V3 0.5 0.25 (-1.5))
--   
inv3 :: forall a f g. Field a => Basis I3 f => Basis I3 g => f (g a) -> g (f a) -- | 4x4 matrix bdeterminant over a commutative semiring. -- --
--   >>> bdet4 (V4 (V4 1 2 3 4) (V4 5 6 7 8) (V4 9 10 11 12) (V4 13 14 15 16))
--   (27728,27728)
--   
bdet4 :: Semiring a => Basis I4 f => Basis I4 g => f (g a) -> (a, a) -- | 4x4 matrix determinant over a commutative ring. -- --
--   det4 == uncurry (-) . bdet4
--   
-- -- This implementation uses a cofactor expansion to avoid loss of -- precision. -- --
--   >>> det4 (m44 1 0 3 2 2 0 2 1 0 0 0 1 0 3 4 0 :: M44 Rational)
--   (-12) % 1
--   
det4 :: Ring a => Basis I4 f => Basis I4 g => f (g a) -> a -- | 4x4 matrix inverse. -- --
--   >>> row I41 $ inv4 (m44 1 0 3 2 2 0 2 1 0 0 0 1 0 3 4 0 :: M44 Rational)
--   V4 (6 % (-12)) ((-9) % (-12)) ((-3) % (-12)) (0 % (-12))
--   
inv4 :: forall a f g. Field a => Basis I4 f => Basis I4 g => f (g a) -> g (f a) -- | Construct a 2x2 matrix. -- -- Arguments are in row-major order. -- --
--   >>> m22 1 2 3 4 :: M22 Int
--   V2 (V2 1 2) (V2 3 4)
--   
-- --
--   m22 :: a -> a -> a -> a -> M22 a
--   
m22 :: Basis I2 f => Basis I2 g => a -> a -> a -> a -> f (g a) -- | Construct a 2x3 matrix. -- -- Arguments are in row-major order. -- --
--   m23 :: a -> a -> a -> a -> a -> a -> M23 a
--   
m23 :: Basis I2 f => Basis I3 g => a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 2x4 matrix. -- -- Arguments are in row-major order. m24 :: Basis I2 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 3x2 matrix. -- -- Arguments are in row-major order. m32 :: Basis I3 f => Basis I2 g => a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 3x3 matrix. -- -- Arguments are in row-major order. m33 :: Basis I3 f => Basis I3 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 3x4 matrix. -- -- Arguments are in row-major order. m34 :: Basis I3 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 4x2 matrix. -- -- Arguments are in row-major order. m42 :: Basis I4 f => Basis I2 g => a -> a -> a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 4x3 matrix. -- -- Arguments are in row-major order. m43 :: Basis I4 f => Basis I3 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a) -- | Construct a 4x4 matrix. -- -- Arguments are in row-major order. m44 :: Basis I4 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a) -- | See the spatial-math package for usage. module Data.Algebra.Quaternion type QuatF = Quaternion Float type QuatD = Quaternion Double type QuatR = Quaternion Rational type QuatM = Quaternion Micro type QuatN = Quaternion Nano type QuatP = Quaternion Pico data Quaternion a Quaternion :: !a -> {-# UNPACK #-} !V3 a -> Quaternion a -- | Obtain a Quaternion from 4 base field elements. quat :: a -> a -> a -> a -> Quaternion a -- | Real or scalar part of a quaternion. scal :: Quaternion a -> a vect :: Quaternion a -> V3 a -- | Use a quaternion to rotate a vector. -- --
--   >>> rotate qk . rotate qj $ V3 1 1 0 :: V3 Int
--   V3 1 (-1) 0
--   
rotate :: Ring a => Quaternion a -> V3 a -> V3 a -- | Scale a QuatD to unit length. -- --
--   >>> normalize $ normalize $ quat 2.0 2.0 2.0 2.0
--   Quaternion 0.5 (V3 0.5 0.5 0.5)
--   
normalize :: QuatD -> QuatD -- | The real quaternion. -- -- Represents no rotation. -- -- qe = unit qe :: Semiring a => Quaternion a -- | The i quaternion. -- -- Represents a <math> radian rotation about the x axis. -- --
--   >>> rotate (qi :: QuatM) $ V3 1 0 0
--   V3 1.000000 0.000000 0.000000
--   
--   >>> rotate (qi :: QuatM) $ V3 0 1 0
--   V3 0.000000 -1.000000 0.000000
--   
--   >>> rotate (qi :: QuatM) $ V3 0 0 1
--   V3 0.000000 0.000000 -1.000000
--   
-- --
--   >>> qi * qj
--   Quaternion 0 (V3 0 0 1)
--   
qi :: Semiring a => Quaternion a -- | The j quaternion. -- -- Represents a <math> radian rotation about the y axis. -- --
--   >>> rotate (qj :: QuatM) $ V3 1 0 0
--   V3 -1.000000 0.000000 0.000000
--   
--   >>> rotate (qj :: QuatM) $ V3 0 1 0
--   V3 0.000000 1.000000 0.000000
--   
--   >>> rotate (qj :: QuatM) $ V3 0 0 1
--   V3 0.000000 0.000000 -1.000000
--   
-- --
--   >>> qj * qk
--   Quaternion 0 (V3 1 0 0)
--   
qj :: Semiring a => Quaternion a -- | The k quaternion. -- -- Represents a <math> radian rotation about the z axis. -- --
--   >>> rotate (qk :: QuatM) $ V3 1 0 0
--   V3 -1.000000 0.000000 0.000000
--   
--   >>> rotate (qk :: QuatM) $ V3 0 1 0
--   V3 0.000000 -1.000000 0.000000
--   
--   >>> rotate (qk :: QuatM) $ V3 0 0 1
--   V3 0.000000 0.000000 1.000000
--   
-- --
--   >>> qk * qi
--   Quaternion 0 (V3 0 1 0)
--   
--   >>> qi * qj * qk
--   Quaternion (-1) (V3 0 0 0)
--   
qk :: Semiring a => Quaternion a instance GHC.Generics.Generic1 Data.Algebra.Quaternion.Quaternion instance GHC.Generics.Generic (Data.Algebra.Quaternion.Quaternion a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Quaternion.Quaternion a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Quaternion.Quaternion a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a)) instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Algebra.Quaternion.Quaternion a) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a)) instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a)) instance Data.Semiring.Ring a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Algebra.Quaternion.Quaternion a)) instance Data.Semiring.Ring a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Algebra.Quaternion.Quaternion a)) instance Data.Semiring.Ring a => Data.Semiring.Presemiring (Data.Algebra.Quaternion.Quaternion a) instance Data.Semiring.Ring a => Data.Semiring.Semiring (Data.Algebra.Quaternion.Quaternion a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Algebra.Quaternion.Quaternion a) instance GHC.Base.Functor Data.Algebra.Quaternion.Quaternion instance Data.Foldable.Foldable Data.Algebra.Quaternion.Quaternion instance Data.Semigroup.Foldable.Class.Foldable1 Data.Algebra.Quaternion.Quaternion instance Data.Distributive.Distributive Data.Algebra.Quaternion.Quaternion instance Data.Functor.Rep.Representable Data.Algebra.Quaternion.Quaternion -- | See the connections package for idempotent & selective -- semirings, and lattices. module Data.Semiring.Property -- | <math> -- -- If R is non-unital (i.e. one is not distinct from -- zero) then it will instead satisfy a right-absorbtion property. -- -- This follows from right-neutrality and right-distributivity. -- -- Compare codistributive and closed_stable. -- -- When R is also left-distributive we get: <math> -- -- See also Warning and -- https://blogs.ncl.ac.uk/andreymokhov/united-monoids/#whatif. nonunital_on :: Presemiring r => Rel r b -> r -> r -> b -- | Presemiring morphisms are distributive semigroup morphisms. -- -- This is a required property for presemiring morphisms. morphism_presemiring :: Eq s => Presemiring r => Presemiring s => (r -> s) -> r -> r -> r -> Bool -- | <math> -- -- All semigroups must right-associate addition. -- -- This is a required property. associative_addition_on :: (Additive - Semigroup) r => Rel r b -> r -> r -> r -> b -- | <math> -- -- This is a an optional property for semigroups, and a -- required property for semirings. commutative_addition_on :: (Additive - Semigroup) r => Rel r b -> r -> r -> b -- | <math> -- -- All semigroups must right-associate multiplication. -- -- This is a required property. associative_multiplication_on :: (Multiplicative - Semigroup) r => Rel r b -> r -> r -> r -> b -- | <math> -- -- R must right-distribute multiplication. -- -- When R is a functor and the semiring structure is derived from -- Alternative, this translates to: -- --
--   (a <|> b) *> c = (a *> c) <|> (b *> c)
--   
-- -- See -- https://en.wikibooks.org/wiki/Haskell/Alternative_and_MonadPlus. -- -- This is a required property. distributive_on :: Presemiring r => Rel r b -> r -> r -> r -> b -- | <math> -- -- R must right-distribute multiplication over finite (non-empty) -- sums. -- -- For types with exact arithmetic this follows from -- distributive and the universality of fold1. distributive_finite1_on :: Presemiring r => Foldable1 f => Rel r b -> f r -> r -> b -- | <math> -- -- Presemiring morphisms must be compatible with right-distribution. morphism_distribitive_on :: Presemiring r => Presemiring s => Rel s b -> (r -> s) -> r -> r -> r -> b -- | Semiring morphisms are monoidal presemiring morphisms. -- -- This is a required property for semiring morphisms. morphism_semiring :: Eq s => Semiring r => Semiring s => (r -> s) -> r -> r -> r -> Bool -- | <math> -- -- A semigroup with a right-neutral additive identity must satisfy: -- --
--   neutral_addition zero ~~ const True
--   
-- -- Or, equivalently: -- --
--   zero + r ~~ r
--   
-- -- This is a required property for additive monoids. neutral_addition_on :: (Additive - Monoid) r => Rel r b -> r -> b -- | <math> -- -- A semigroup with a right-neutral multiplicative identity must satisfy: -- --
--   neutral_multiplication one ~~ const True
--   
-- -- Or, equivalently: -- --
--   one * r ~~ r
--   
-- -- This is a required propert for multiplicative monoids. neutral_multiplication_on :: (Multiplicative - Monoid) r => Rel r b -> r -> b -- | <math> -- -- A R is semiring then its addititive one must be -- right-annihilative, i.e.: -- --
--   zero * a ~~ zero
--   
-- -- For Alternative instances this property translates to: -- --
--   empty *> a ~~ empty
--   
-- -- All right semirings must have a right-absorbative addititive one, -- however note that depending on the Prd instance this does not -- preclude IEEE754-mandated behavior such as: -- --
--   zero * NaN ~~ NaN
--   
-- -- This is a required property. annihilative_multiplication_on :: Semiring r => Rel r b -> r -> b -- | <math> -- -- R must right-distribute multiplication between finite sums. -- -- For types with exact arithmetic this follows from -- distributive & neutral_multiplication. distributive_finite_on :: Semiring r => Foldable f => Rel r b -> f r -> r -> b -- | <math> -- -- If R is also left-distributive then it supports -- cross-multiplication. distributive_cross_on :: Semiring r => Applicative f => Foldable f => Rel r b -> f r -> f r -> b -- | <math> -- -- If R is also left-distributive then it supports (non-empty) -- cross-multiplication. distributive_cross1_on :: Presemiring r => Apply f => Foldable1 f => Rel r b -> f r -> f r -> b -- | <math> -- -- This is a an optional property for semigroups, and a -- optional property for semirings. It is a required -- property for rings. commutative_multiplication_on :: (Multiplicative - Semigroup) r => Rel r b -> r -> r -> b -- | <math> -- -- If R is right-cancellative wrt addition then for all a -- the section (a +) is injective. -- -- See https://en.wikipedia.org/wiki/Cancellation_property cancellative_addition_on :: (Additive - Semigroup) r => Rel r Bool -> r -> r -> r -> Bool -- | <math> -- -- If R is right-cancellative wrt multiplication then for all -- a the section (a *) is injective. cancellative_multiplication_on :: (Multiplicative - Semigroup) r => Rel r Bool -> r -> r -> r -> Bool