-- 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.1.3 module Data.Semiring -- | Hyphenation operator. type ( g - f ) a = f (g a) infixl 6 - -- | Tensor product. type f ** g = Compose f g infixr 2 ** -- | Direct sum. type f ++ g = Product f g infixr 1 ++ type Free = Representable type PresemiringLaw a = ((Additive - Semigroup) a, (Multiplicative - Semigroup) 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. class PresemiringLaw a => Presemiring a -- | Additive semigroup operation on a semiring. -- --
--   >>> Dual [2] + Dual [3] :: Dual [Int]
--   Dual {getDual = [3,2]}
--   
(+) :: (Additive - Semigroup) a => a -> a -> a infixl 6 + -- | Multiplicative semigroup operation on a semiring. -- --
--   >>> Dual [2] * Dual [3] :: Dual [Int]
--   Dual {getDual = [5]}
--   
(*) :: (Multiplicative - Semigroup) a => a -> a -> a infixl 7 * -- | Evaluate a non-empty presemiring sum. sum1 :: (Additive - Semigroup) a => Foldable1 f => f a -> a -- | Evaluate a non-empty presemiring sum using a given presemiring. -- --
--   >>> evalWith1 Max $ (1 :| [2..5 :: Int]) :| [1 :| [2..5 :: Int]]
--   | 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 :: (Additive - Semigroup) a => Foldable1 t => (b -> a) -> t b -> a -- | Evaluate a non-empty presemiring product. product1 :: (Multiplicative - Semigroup) a => Foldable1 f => f a -> a -- | Evaluate a non-empty presemiring product using a given presemiring. -- -- 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 :: (Multiplicative - Semigroup) a => Foldable1 t => (b -> a) -> t b -> a -- | Cross-multiply two non-empty collections. -- --
--   >>> xmult1 (Right 2 :| [Left "oops"]) (Right 2 :| [Right 3]) :: Either [Char] Int
--   Right 4
--   
xmult1 :: Presemiring a => Foldable1 f => Apply f => f a -> f a -> a -- | Evaluate a presemiring expression. eval1 :: Presemiring a => Functor f => Foldable1 f => Foldable1 g => f (g a) -> a -- | Evaluate a presemiring expression using a given presemiring. -- --
--   >>> evalWith1 (Max . Down) $ (1 :| [2..5 :: Int]) :| [-5 :| [2..5 :: Int]]
--   Max {getMax = Down 9}
--   
--   >>> evalWith1 Max $ (1 :| [2..5 :: Int]) :| [-5 :| [2..5 :: Int]]
--   Max {getMax = 15}
--   
evalWith1 :: Presemiring r => Functor f => Functor g => Foldable1 f => Foldable1 g => (a -> r) -> f (g a) -> r 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 -- | Additive unit of a semiring. zero :: (Additive - Monoid) a => a -- | Multiplicative unit of a semiring. one :: (Multiplicative - Monoid) a => a -- |
--   two = one + one
--   
two :: Semiring a => a -- | Evaluate a natural-numbered power of a semiring element. -- --
--   one = a ^ 0
--   
-- --
--   >>> 8 ^ 0 :: Int
--   1
--   
(^) :: Semiring a => a -> Natural -> a infixr 8 ^ -- | Evaluate a semiring sum. -- --
--   >>> sum [1..5 :: Int]
--   15
--   
sum :: (Additive - Monoid) a => Foldable f => f a -> a -- | Evaluate a semiring sum using a given semiring. sumWith :: (Additive - Monoid) a => Foldable f => (b -> a) -> f b -> a -- | Evaluate a semiring product. -- --
--   >>> product [1..5 :: Int]
--   120
--   
product :: (Multiplicative - Monoid) a => Foldable f => f a -> a -- | Evaluate a semiring product using a given semiring. -- --
--   product f = foldr' ((*) . f) one
--   
-- --
--   >>> productWith Just [1..5 :: Int]
--   Just 120
--   
productWith :: (Multiplicative - Monoid) a => Foldable f => (b -> a) -> f b -> a -- | Cross-multiply two collections. -- --
--   >>> xmult (V3 1 2 3) (V3 1 2 3)
--   14
--   
--   >>> xmult [1,2,3 :: Int] [1,2,3]
--   36
--   
--   >>> xmult [1,2,3 :: Int] []
--   0
--   
xmult :: Semiring a => Foldable f => Applicative f => 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 -- | Evaluate a semiring expression using a given semiring. -- --
--   >>> evalWith Max [[1..4 :: Int], [0..2 :: Int]]
--   Max {getMax = 24}
--   
evalWith :: Semiring r => Functor f => Functor g => Foldable f => Foldable g => (a -> r) -> f (g a) -> r 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 -- | Subtract two elements. -- --
--   a - b = subtract b a
--   
(-) :: (Additive - Group) a => a -> a -> a infixl 6 - -- | Subtract two elements. subtract :: (Additive - Group) a => a -> a -> a -- | Reverse the sign of an element. negate :: (Additive - Group) a => a -> a -- | Absolute value of an element. -- --
--   abs r = r * (signum r)
--   
abs :: (Additive - Group) a => Ord a => a -> a -- | Extract the sign of an element. -- -- signum satisfies a trichotomy law: -- --
--   signum r = negate r || zero || r
--   
-- -- This follows from the fact that ordered rings are abelian, linearly -- ordered groups with respect to addition. -- -- See https://en.wikipedia.org/wiki/Linearly_ordered_group. signum :: Ring a => Ord a => a -> a -- | A commutative Semigroup under +. newtype Additive a Additive :: a -> Additive a [unAdditive] :: Additive a -> a -- | A (potentially non-commutative) Semigroup under *. newtype Multiplicative a Multiplicative :: a -> Multiplicative a [unMultiplicative] :: Multiplicative 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 class Magma a (<<) :: Magma a => a -> a -> a infixl 6 << class Magma a => Quasigroup a class Quasigroup a => Loop a class (Loop a, Monoid a) => Group a inv :: Group a => a -> a greplicate :: Group a => Integer -> a -> a instance GHC.Base.Functor Data.Semiring.Multiplicative instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.Multiplicative a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.Multiplicative a) instance GHC.Generics.Generic (Data.Semiring.Multiplicative a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.Multiplicative a) instance GHC.Base.Functor Data.Semiring.Additive instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.Additive a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.Additive a) instance GHC.Generics.Generic (Data.Semiring.Additive a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.Additive a) instance Data.Semiring.Ring a => Data.Semiring.Presemiring (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 (e -> 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 (e -> a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (GHC.Maybe.Maybe a) instance (Data.Semiring.-) Data.Semiring.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.Semiring.-) Data.Semiring.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 (e -> 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.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => Data.Semiring.Presemiring [a] instance (Data.Semiring.-) Data.Semiring.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) instance GHC.Base.Applicative Data.Semiring.Multiplicative instance Data.Distributive.Distributive Data.Semiring.Multiplicative instance Data.Functor.Rep.Representable Data.Semiring.Multiplicative instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semiring.Additive (GHC.Real.Ratio a)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semiring.Additive (GHC.Real.Ratio a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a) => Data.Magma.Magma (Data.Semiring.Additive (GHC.Real.Ratio a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a) => Data.Group.Quasigroup (Data.Semiring.Additive (GHC.Real.Ratio a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a) => Data.Group.Loop (Data.Semiring.Additive (GHC.Real.Ratio a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a) => Data.Group.Group (Data.Semiring.Additive (GHC.Real.Ratio a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative [a]) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative [a]) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (GHC.Base.NonEmpty a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semigroup.Min a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semigroup.Min a)) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Types.Int) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Int.Int8) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Int.Int16) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Int.Int32) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Int.Int64) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Integer.Type.Integer) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Types.Word) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Word.Word8) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Word.Word16) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Word.Word32) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Word.Word64) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Natural.Natural) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Uni) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Deci) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Centi) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Milli) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Micro) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Nano) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.Fixed.Pico) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Types.Float) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Foreign.C.Types.CFloat) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Types.Double) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Foreign.C.Types.CDouble) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Types.Int) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Int.Int8) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Int.Int16) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Int.Int32) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Int.Int64) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Integer.Type.Integer) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Types.Word) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Word.Word8) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Word.Word16) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Word.Word32) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Word.Word64) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Natural.Natural) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Uni) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Deci) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Centi) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Milli) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Micro) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Nano) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Data.Fixed.Pico) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Types.Float) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Foreign.C.Types.CFloat) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Types.Double) instance GHC.Base.Monoid (Data.Semiring.Multiplicative Foreign.C.Types.CDouble) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Uni) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Deci) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Centi) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Milli) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Micro) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Nano) instance Data.Magma.Magma (Data.Semiring.Multiplicative Data.Fixed.Pico) instance Data.Magma.Magma (Data.Semiring.Multiplicative GHC.Types.Float) instance Data.Magma.Magma (Data.Semiring.Multiplicative Foreign.C.Types.CFloat) instance Data.Magma.Magma (Data.Semiring.Multiplicative GHC.Types.Double) instance Data.Magma.Magma (Data.Semiring.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Uni) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Deci) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Centi) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Milli) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Micro) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Nano) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Data.Fixed.Pico) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative GHC.Types.Float) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative GHC.Types.Double) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Uni) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Deci) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Centi) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Milli) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Micro) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Nano) instance Data.Group.Loop (Data.Semiring.Multiplicative Data.Fixed.Pico) instance Data.Group.Loop (Data.Semiring.Multiplicative GHC.Types.Float) instance Data.Group.Loop (Data.Semiring.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Loop (Data.Semiring.Multiplicative GHC.Types.Double) instance Data.Group.Loop (Data.Semiring.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Uni) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Deci) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Centi) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Milli) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Micro) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Nano) instance Data.Group.Group (Data.Semiring.Multiplicative Data.Fixed.Pico) instance Data.Group.Group (Data.Semiring.Multiplicative GHC.Types.Float) instance Data.Group.Group (Data.Semiring.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Group (Data.Semiring.Multiplicative GHC.Types.Double) instance Data.Group.Group (Data.Semiring.Multiplicative Foreign.C.Types.CDouble) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => Data.Magma.Magma (Data.Semiring.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => Data.Group.Quasigroup (Data.Semiring.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => Data.Group.Loop (Data.Semiring.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => Data.Group.Group (Data.Semiring.Multiplicative (GHC.Real.Ratio a)) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative ()) instance GHC.Base.Monoid (Data.Semiring.Multiplicative ()) instance Data.Magma.Magma (Data.Semiring.Multiplicative ()) instance Data.Group.Quasigroup (Data.Semiring.Multiplicative ()) instance Data.Group.Loop (Data.Semiring.Multiplicative ()) instance Data.Group.Group (Data.Semiring.Multiplicative ()) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative GHC.Types.Bool) instance GHC.Base.Monoid (Data.Semiring.Multiplicative GHC.Types.Bool) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semigroup.Internal.Dual a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semigroup.Internal.Dual a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Ord.Down a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Ord.Down a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semigroup.Max a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semigroup.Max a)) instance ((Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semiring.Multiplicative (a, b)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup b => GHC.Base.Semigroup (Data.Semiring.Multiplicative (a -> b)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid b => GHC.Base.Monoid (Data.Semiring.Multiplicative (a -> b)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (GHC.Maybe.Maybe a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (GHC.Maybe.Maybe a)) instance ((Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Either.Either a b)) instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Map.Internal.Map k a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Semigroup (Data.Semiring.Multiplicative Data.IntSet.Internal.IntSet) instance (GHC.Classes.Ord k, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid k, (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Map.Internal.Map k a)) instance (Data.Semiring.-) Data.Semiring.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Applicative Data.Semiring.Additive instance Data.Distributive.Distributive Data.Semiring.Additive instance Data.Functor.Rep.Representable Data.Semiring.Additive instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Types.Int) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Int.Int8) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Int.Int16) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Int.Int32) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Int.Int64) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Integer.Type.Integer) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Types.Word) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Word.Word8) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Word.Word16) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Word.Word32) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Word.Word64) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Natural.Natural) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Uni) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Deci) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Centi) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Milli) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Micro) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Nano) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.Fixed.Pico) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Types.Float) instance GHC.Base.Semigroup (Data.Semiring.Additive Foreign.C.Types.CFloat) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Types.Double) instance GHC.Base.Semigroup (Data.Semiring.Additive Foreign.C.Types.CDouble) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Types.Int) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Int.Int8) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Int.Int16) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Int.Int32) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Int.Int64) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Integer.Type.Integer) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Types.Word) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Word.Word8) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Word.Word16) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Word.Word32) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Word.Word64) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Natural.Natural) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Uni) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Deci) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Centi) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Milli) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Micro) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Nano) instance GHC.Base.Monoid (Data.Semiring.Additive Data.Fixed.Pico) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Types.Float) instance GHC.Base.Monoid (Data.Semiring.Additive Foreign.C.Types.CFloat) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Types.Double) instance GHC.Base.Monoid (Data.Semiring.Additive Foreign.C.Types.CDouble) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Types.Int) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Int.Int8) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Int.Int16) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Int.Int32) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Int.Int64) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Integer.Type.Integer) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Uni) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Deci) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Centi) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Milli) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Micro) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Nano) instance Data.Magma.Magma (Data.Semiring.Additive Data.Fixed.Pico) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Types.Float) instance Data.Magma.Magma (Data.Semiring.Additive Foreign.C.Types.CFloat) instance Data.Magma.Magma (Data.Semiring.Additive GHC.Types.Double) instance Data.Magma.Magma (Data.Semiring.Additive Foreign.C.Types.CDouble) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Types.Int) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Int.Int8) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Int.Int16) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Int.Int32) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Int.Int64) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Integer.Type.Integer) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Uni) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Deci) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Centi) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Milli) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Micro) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Nano) instance Data.Group.Quasigroup (Data.Semiring.Additive Data.Fixed.Pico) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Types.Float) instance Data.Group.Quasigroup (Data.Semiring.Additive Foreign.C.Types.CFloat) instance Data.Group.Quasigroup (Data.Semiring.Additive GHC.Types.Double) instance Data.Group.Quasigroup (Data.Semiring.Additive Foreign.C.Types.CDouble) instance Data.Group.Loop (Data.Semiring.Additive GHC.Types.Int) instance Data.Group.Loop (Data.Semiring.Additive GHC.Int.Int8) instance Data.Group.Loop (Data.Semiring.Additive GHC.Int.Int16) instance Data.Group.Loop (Data.Semiring.Additive GHC.Int.Int32) instance Data.Group.Loop (Data.Semiring.Additive GHC.Int.Int64) instance Data.Group.Loop (Data.Semiring.Additive GHC.Integer.Type.Integer) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Uni) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Deci) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Centi) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Milli) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Micro) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Nano) instance Data.Group.Loop (Data.Semiring.Additive Data.Fixed.Pico) instance Data.Group.Loop (Data.Semiring.Additive GHC.Types.Float) instance Data.Group.Loop (Data.Semiring.Additive Foreign.C.Types.CFloat) instance Data.Group.Loop (Data.Semiring.Additive GHC.Types.Double) instance Data.Group.Loop (Data.Semiring.Additive Foreign.C.Types.CDouble) instance Data.Group.Group (Data.Semiring.Additive GHC.Types.Int) instance Data.Group.Group (Data.Semiring.Additive GHC.Int.Int8) instance Data.Group.Group (Data.Semiring.Additive GHC.Int.Int16) instance Data.Group.Group (Data.Semiring.Additive GHC.Int.Int32) instance Data.Group.Group (Data.Semiring.Additive GHC.Int.Int64) instance Data.Group.Group (Data.Semiring.Additive GHC.Integer.Type.Integer) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Uni) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Deci) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Centi) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Milli) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Micro) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Nano) instance Data.Group.Group (Data.Semiring.Additive Data.Fixed.Pico) instance Data.Group.Group (Data.Semiring.Additive GHC.Types.Float) instance Data.Group.Group (Data.Semiring.Additive Foreign.C.Types.CFloat) instance Data.Group.Group (Data.Semiring.Additive GHC.Types.Double) instance Data.Group.Group (Data.Semiring.Additive Foreign.C.Types.CDouble) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a, Data.Semiring.Free f, Data.Semiring.Free g) => GHC.Base.Semigroup (Data.Semiring.Additive ((Data.Semiring.++) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a, Data.Semiring.Free f, Data.Semiring.Free g) => GHC.Base.Monoid (Data.Semiring.Additive ((Data.Semiring.++) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Magma.Magma (Data.Semiring.Additive ((Data.Semiring.++) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Group.Quasigroup (Data.Semiring.Additive ((Data.Semiring.++) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Group.Loop (Data.Semiring.Additive ((Data.Semiring.++) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Group.Group (Data.Semiring.Additive ((Data.Semiring.++) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a, Data.Semiring.Free f, Data.Semiring.Free g) => GHC.Base.Semigroup (Data.Semiring.Additive ((Data.Semiring.**) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a, Data.Semiring.Free f, Data.Semiring.Free g) => GHC.Base.Monoid (Data.Semiring.Additive ((Data.Semiring.**) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Magma.Magma (Data.Semiring.Additive ((Data.Semiring.**) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Group.Quasigroup (Data.Semiring.Additive ((Data.Semiring.**) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Group.Loop (Data.Semiring.Additive ((Data.Semiring.**) f g a)) instance ((Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a, Data.Semiring.Free f, Data.Semiring.Free g) => Data.Group.Group (Data.Semiring.Additive ((Data.Semiring.**) f g a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Complex.Complex a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Complex.Complex a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Complex.Complex a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Complex.Complex a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Complex.Complex a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Complex.Complex a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup b => GHC.Base.Semigroup (Data.Semiring.Additive (a -> b)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid b => GHC.Base.Monoid (Data.Semiring.Additive (a -> b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group b => Data.Magma.Magma (Data.Semiring.Additive (a -> b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group b => Data.Group.Quasigroup (Data.Semiring.Additive (a -> b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group b => Data.Group.Loop (Data.Semiring.Additive (a -> b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group b => Data.Group.Group (Data.Semiring.Additive (a -> b)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Functor.Contravariant.Op a b)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Functor.Contravariant.Op a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Functor.Contravariant.Op a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Functor.Contravariant.Op a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Functor.Contravariant.Op a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Functor.Contravariant.Op a b)) instance GHC.Base.Semigroup (Data.Semiring.Additive [a]) instance GHC.Base.Monoid (Data.Semiring.Additive [a]) instance GHC.Base.Semigroup (Data.Semiring.Additive (GHC.Base.NonEmpty a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Ord.Down a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Ord.Down a)) instance GHC.Base.Semigroup (Data.Semiring.Additive ()) instance GHC.Base.Monoid (Data.Semiring.Additive ()) instance Data.Magma.Magma (Data.Semiring.Additive ()) instance Data.Group.Quasigroup (Data.Semiring.Additive ()) instance Data.Group.Loop (Data.Semiring.Additive ()) instance Data.Group.Group (Data.Semiring.Additive ()) instance GHC.Base.Semigroup (Data.Semiring.Additive GHC.Types.Bool) instance GHC.Base.Monoid (Data.Semiring.Additive GHC.Types.Bool) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semiring.Additive (a, b)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid b) => GHC.Base.Monoid (Data.Semiring.Additive (a, b)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup b, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup c) => GHC.Base.Semigroup (Data.Semiring.Additive (a, b, c)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid b, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid c) => GHC.Base.Monoid (Data.Semiring.Additive (a, b, c)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (GHC.Maybe.Maybe a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Semiring.Additive (GHC.Maybe.Maybe a)) instance ((Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Either.Either a b)) instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Map.Internal.Map k a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Semigroup (Data.Semiring.Additive Data.IntSet.Internal.IntSet) instance GHC.Base.Monoid (Data.Semiring.Additive Data.IntSet.Internal.IntSet) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Semiring.Additive (Data.IntMap.Internal.IntMap a)) instance GHC.Classes.Ord a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a) => GHC.Base.Monoid (Data.Semiring.Additive (Data.Map.Internal.Map k a)) module Data.Semifield type SemifieldLaw a = ((Additive - Monoid) a, (Multiplicative - Group) a) -- | A semifield, near-field, or division ring. -- -- Instances needn't have commutative multiplication or additive -- inverses, however addition must be commutative, and addition and -- multiplication must be associative as usual. -- -- See also the wikipedia definitions of: -- -- class (Semiring a, SemifieldLaw a) => Semifield a -- | The NaN value of the semifield. -- --
--   anan = zero / zero
--   
anan :: Semifield a => a -- | The positive infinity of the semifield. -- --
--   pinf = one / zero
--   
pinf :: Semifield a => a -- | Right division by a multiplicative group element. (/) :: (Multiplicative - Group) a => a -> a -> a infixl 7 / -- | Left division by a multiplicative group element. -- -- When * is commutative we must have: -- --
--   x \\ y = y / x
--   
(\\) :: (Multiplicative - Group) a => a -> a -> a infixl 7 \\ -- | Reciprocal of a multiplicative group element. -- --
--   x / y = x * recip y
--   x \\ y = recip x * y
--   
-- --
--   >>> 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 type FieldLaw a = ((Additive - Group) a, (Multiplicative - Group) a) -- | A field. class (Ring a, Semifield a, FieldLaw a) => Field a -- | A type modeling the real numbers. class Field a => Real a -- | The one / zero value of the field. -- --
--   ninf = negate one / zero
--   
ninf :: Field a => a -- | Integral power of a multiplicative group element. -- --
--   one == a ^^ 0
--   
-- --
--   >>> 8 ^^ 0 :: Double
--   1.0
--   
--   >>> 8 ^^ 0 :: Pico
--   1.000000000000
--   
(^^) :: (Multiplicative - Group) a => a -> Integer -> a infixr 8 ^^ instance Data.Semifield.Real GHC.Real.Rational instance Data.Semifield.Real Data.Fixed.Uni instance Data.Semifield.Real Data.Fixed.Deci instance Data.Semifield.Real Data.Fixed.Centi instance Data.Semifield.Real Data.Fixed.Milli instance Data.Semifield.Real Data.Fixed.Micro instance Data.Semifield.Real Data.Fixed.Nano instance Data.Semifield.Real Data.Fixed.Pico instance Data.Semifield.Real GHC.Types.Float instance Data.Semifield.Real GHC.Types.Double instance Data.Semifield.Real Foreign.C.Types.CFloat instance Data.Semifield.Real Foreign.C.Types.CDouble 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.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 LeftModule l a = (Ring l, (Additive - Group) a, LeftSemimodule l a) -- | Left semimodule over a commutative semiring. -- -- All instances must satisfy the following identities: -- --
--   lscale s (x + y) = lscale s x + lscale s y
--   lscale (s1 + s2) x = lscale s1 x + lscale s2 x
--   lscale (s1 * s2) = lscale s1 . lscale s2
--   lscale zero = zero
--   
-- -- When the ring of coefficients s is unital we must additionally -- have: lscale one = id -- -- See the properties module for a detailed specification of the laws. class (Semiring l, (Additive - Monoid) a) => LeftSemimodule l a -- | Left-multiply by a scalar. lscale :: LeftSemimodule l a => l -> a -> a -- | Left-multiply a module element by a scalar. (*.) :: LeftSemimodule l a => l -> a -> a infixr 7 *. -- | Right-divide a vector by a scalar (on the left). (/.) :: Semifield a => Functor f => a -> f a -> f a infixr 7 /. -- | Left-divide a vector by a scalar. (\.) :: Semifield a => Functor f => a -> f a -> f a infixr 7 \. -- | 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 :: LeftModule r a => r -> a -> a -> a -- | Default definition of lscale for a free module. lscaleDef :: Semiring a => Functor f => a -> f a -> f a infixr 7 `lscaleDef` -- | Default definition of << for a commutative group. negateDef :: LeftModule Integer a => a -> a type RightModule r a = (Ring r, (Additive - Group) a, RightSemimodule r a) -- | Right semimodule over a commutative semiring. -- -- The laws for right semimodules are analagous to those of left -- semimodules. -- -- See the properties module for a detailed specification. class (Semiring r, (Additive - Monoid) a) => RightSemimodule r a -- | Right-multiply by a scalar. rscale :: RightSemimodule r a => r -> a -> a -- | Right-multiply a module element by a scalar. (.*) :: RightSemimodule r a => a -> r -> a infixl 7 .* -- | Right-divide a vector by a scalar. (./) :: Semifield a => Functor f => f a -> a -> f a infixl 7 ./ -- | Left-divide a vector by a scalar (on the right). (.\) :: Semifield a => Functor f => f a -> a -> f a infixl 7 .\ -- | Default definition of rscale for a free module. rscaleDef :: Semiring a => Functor f => a -> f a -> f a infixl 7 `rscaleDef` type Bimodule l r a = (LeftModule l a, RightModule r a, Bisemimodule l r a) type FreeModule a f = (Free f, (Additive - Group) (f a), Bimodule a a (f a)) type FreeSemimodule a f = (Free f, Bisemimodule a a (f a)) -- | Bisemimodule over a commutative semiring. -- --
--   lscale l . rscale r = rscale r . lscale l
--   
class (LeftSemimodule l a, RightSemimodule r a) => Bisemimodule l r a -- | Left and right-multiply by two scalars. discale :: Bisemimodule l r a => l -> r -> a -> a -- | An algebra over a free module f. -- -- Note that this is distinct from a free algebra. type FreeAlgebra a f = (FreeSemimodule a f, Algebra a (Rep f)) -- | An algebra over a semiring. -- -- Note that the algebra needn't be associative. class Semiring a => Algebra a b -- |
--   joined = runLin diagonal . uncurry
--   
joined :: Algebra a b => (b -> b -> a) -> b -> a -- | A unital algebra over a free semimodule f. type FreeUnital a f = (FreeAlgebra a f, Unital a (Rep f)) -- | A unital algebra over a semiring. class Algebra a b => Unital a b -- |
--   unital = runLin initial . const
--   
unital :: Unital a b => a -> b -> a -- | A coalgebra over a free semimodule f. type FreeCoalgebra a f = (FreeSemimodule a f, Coalgebra a (Rep f)) -- | A coalgebra over a semiring. class Semiring a => Coalgebra a c -- |
--   cojoined = curry . runLin codiagonal
--   
cojoined :: Coalgebra a c => (c -> a) -> c -> c -> a -- | A counital coalgebra over a free semimodule f. type FreeCounital a f = (FreeCoalgebra a f, Counital a (Rep f)) -- | A counital coalgebra over a semiring. class Coalgebra a c => Counital a c counital :: Counital a c => (c -> a) -> a -- | A bialgebra over a free semimodule f. type FreeBialgebra a f = (FreeAlgebra a f, FreeCoalgebra a f, Bialgebra a (Rep f)) -- | A bialgebra over a semiring. class (Unital a b, Counital a b) => Bialgebra a b instance Data.Semiring.Semiring a => Data.Semimodule.Bialgebra a () instance (Data.Semimodule.Bialgebra a b1, Data.Semimodule.Bialgebra a b2) => Data.Semimodule.Bialgebra a (b1, b2) instance (Data.Semimodule.Bialgebra a b1, Data.Semimodule.Bialgebra a b2, Data.Semimodule.Bialgebra a b3) => Data.Semimodule.Bialgebra a (b1, b2, b3) instance Data.Semiring.Semiring a => Data.Semimodule.Bialgebra a [b] instance Data.Semiring.Semiring a => Data.Semimodule.Bialgebra a (Data.Sequence.Internal.Seq b) instance Data.Semiring.Semiring a => Data.Semimodule.Counital a () instance (Data.Semimodule.Counital a c1, Data.Semimodule.Counital a c2) => Data.Semimodule.Counital a (c1, c2) instance (Data.Semimodule.Counital a c1, Data.Semimodule.Counital a c2, Data.Semimodule.Counital a c3) => Data.Semimodule.Counital a (c1, c2, c3) instance Data.Semimodule.Unital a b => Data.Semimodule.Counital a (b -> a) instance Data.Semiring.Semiring a => Data.Semimodule.Counital a [c] instance Data.Semiring.Semiring a => Data.Semimodule.Counital a (Data.Sequence.Internal.Seq c) instance (Data.Semiring.Semiring a, GHC.Classes.Ord c) => Data.Semimodule.Counital a (Data.Set.Internal.Set c) instance Data.Semiring.Semiring a => Data.Semimodule.Counital a Data.IntSet.Internal.IntSet instance Data.Semiring.Semiring a => Data.Semimodule.Coalgebra a () instance (Data.Semimodule.Coalgebra a c1, Data.Semimodule.Coalgebra a c2) => Data.Semimodule.Coalgebra a (c1, c2) instance (Data.Semimodule.Coalgebra a c1, Data.Semimodule.Coalgebra a c2, Data.Semimodule.Coalgebra a c3) => Data.Semimodule.Coalgebra a (c1, c2, c3) instance Data.Semimodule.Algebra a b => Data.Semimodule.Coalgebra a (b -> a) instance Data.Semiring.Semiring a => Data.Semimodule.Coalgebra a [c] instance Data.Semiring.Semiring a => Data.Semimodule.Coalgebra a (Data.Sequence.Internal.Seq c) instance (Data.Semiring.Semiring a, GHC.Classes.Ord c) => Data.Semimodule.Coalgebra a (Data.Set.Internal.Set c) instance Data.Semiring.Semiring a => Data.Semimodule.Coalgebra a Data.IntSet.Internal.IntSet instance Data.Semiring.Semiring a => Data.Semimodule.Unital a () instance (Data.Semimodule.Unital a b1, Data.Semimodule.Unital a b2) => Data.Semimodule.Unital a (b1, b2) instance (Data.Semimodule.Unital a b1, Data.Semimodule.Unital a b2, Data.Semimodule.Unital a b3) => Data.Semimodule.Unital a (b1, b2, b3) instance Data.Semiring.Semiring a => Data.Semimodule.Unital a [b] instance Data.Semiring.Semiring a => Data.Semimodule.Unital a (Data.Sequence.Internal.Seq b) instance (Data.Semiring.Semiring a, GHC.Classes.Ord b) => Data.Semimodule.Unital a (Data.Set.Internal.Set b) instance Data.Semiring.Semiring a => Data.Semimodule.Unital a Data.IntSet.Internal.IntSet instance Data.Semiring.Semiring a => Data.Semimodule.Algebra a () instance (Data.Semimodule.Algebra a b1, Data.Semimodule.Algebra a b2) => Data.Semimodule.Algebra a (b1, b2) instance (Data.Semimodule.Algebra a b1, Data.Semimodule.Algebra a b2, Data.Semimodule.Algebra a b3) => Data.Semimodule.Algebra a (b1, b2, b3) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra a [b] instance Data.Semiring.Semiring a => Data.Semimodule.Algebra a (Data.Sequence.Internal.Seq b) instance (Data.Semiring.Semiring a, GHC.Classes.Ord b) => Data.Semimodule.Algebra a (Data.Set.Internal.Set b) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra a Data.IntSet.Internal.IntSet instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a a instance Data.Semimodule.Bisemimodule r r a => Data.Semimodule.Bisemimodule r r (e -> a) instance Data.Semimodule.Bisemimodule r r a => Data.Semimodule.Bisemimodule r r (Data.Functor.Contravariant.Op a e) instance (Data.Semimodule.Bisemimodule r r a, Data.Semimodule.Bisemimodule r r b) => Data.Semimodule.Bisemimodule r r (a, b) instance (Data.Semimodule.Bisemimodule r r a, Data.Semimodule.Bisemimodule r r b, Data.Semimodule.Bisemimodule r r c) => Data.Semimodule.Bisemimodule r r (a, b, c) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (GHC.Real.Ratio a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a a instance Data.Semimodule.RightSemimodule r a => Data.Semimodule.RightSemimodule r (e -> a) instance Data.Semimodule.RightSemimodule r a => Data.Semimodule.RightSemimodule r (Data.Functor.Contravariant.Op a e) instance (Data.Semimodule.RightSemimodule r a, Data.Semimodule.RightSemimodule r b) => Data.Semimodule.RightSemimodule r (a, b) instance (Data.Semimodule.RightSemimodule r a, Data.Semimodule.RightSemimodule r b, Data.Semimodule.RightSemimodule r c) => Data.Semimodule.RightSemimodule r (a, b, c) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (GHC.Real.Ratio a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a a instance Data.Semimodule.LeftSemimodule l a => Data.Semimodule.LeftSemimodule l (e -> a) instance Data.Semimodule.LeftSemimodule l a => Data.Semimodule.LeftSemimodule l (Data.Functor.Contravariant.Op a e) instance (Data.Semimodule.LeftSemimodule l a, Data.Semimodule.LeftSemimodule l b) => Data.Semimodule.LeftSemimodule l (a, b) instance (Data.Semimodule.LeftSemimodule l a, Data.Semimodule.LeftSemimodule l b, Data.Semimodule.LeftSemimodule l c) => Data.Semimodule.LeftSemimodule l (a, b, c) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (GHC.Real.Ratio a) instance Data.Semiring.Ring a => Data.Semimodule.LeftSemimodule a (Data.Complex.Complex a) module Data.Semimodule.Free type Free = Representable -- | A vector in a vector space or free semimodule. -- -- Equivalent to Op. -- -- Vectors transform contravariantly as a function of their bases. -- -- See -- https://en.wikipedia.org/wiki/Covariance_and_contravariance_of_vectors#Definition. newtype Vec a b Vec :: (b -> a) -> Vec a b [runVec] :: Vec a b -> b -> a infixr 3 `runVec` -- | Use a linear transformation to map over a vector space. -- -- Note that the basis transforms -- https://en.wikipedia.org/wiki/Covariant_transformation#Contravariant_transformation -- contravariantly. vmap :: Lin a b c -> Vec a c -> Vec a b -- | Obtain a vector from a vector on the tensor product space. join :: Algebra a b => Vec a (b, b) -> Vec a b -- | Obtain a vector from the unit of a unital algebra. -- --
--   init a = vmap initial (Vec $ _ -> a)
--   
init :: Unital a b => a -> Vec a b -- | Apply a covector to a vector on the right. (!*) :: Vec a b -> Cov a b -> a infixr 7 !* -- | Apply a covector to a vector on the left. (*!) :: Cov a b -> Vec a b -> a infixl 7 *! -- | Multiplication operator on an algebra over a free semimodule. -- --
--   >>> flip runVec E22 $ (vec $ V2 1 2) !*! (vec $ V2 7 4)
--   8
--   
-- -- Caution in general mult needn't be commutative, nor -- associative. (!*!) :: Algebra a b => Vec a b -> Vec a b -> Vec a b infixr 7 !*! -- | Linear functionals from elements of a free semimodule to a scalar. -- --
--   f !* (x + y) = (f !* x) + (f !* y)
--   f !* (x .* a) = a * (f !* x)
--   
-- -- Caution: You must ensure these laws hold when using the default -- constructor. -- -- Co-vectors transform covariantly as a function of their bases. -- -- See -- https://en.wikipedia.org/wiki/Covariance_and_contravariance_of_vectors#Definition. newtype Cov a c Cov :: ((c -> a) -> a) -> Cov a c [runCov] :: Cov a c -> (c -> a) -> a infixr 3 `runCov` -- | Obtain a covector from a linear combination of basis elements. -- --
--   >>> images [(2, E31),(3, E32)] !* vec (V3 1 1 1) :: Int
--   5
--   
images :: Semiring a => Foldable f => f (a, c) -> Cov a c -- | Use a linear transformation to map over a dual space. -- -- Note that the basis transforms covariantly. cmap :: Lin a b c -> Cov a b -> Cov a c -- | Obtain a covector from a covector on the tensor product space. cojoin :: Coalgebra a c => Cov a (c, c) -> Cov a c -- | Obtain a covector from the counit of a counital coalgebra. -- --
--   coinit = cmap coinitial (Cov $ f -> f ())
--   
coinit :: Counital a c => Cov a c -- | Multiplication operator on a coalgebra over a free semimodule. -- --
--   >>> flip runCov (e2 1 1) $ comult (cov $ V2 1 2) (cov $ V2 7 4)
--   11
--   
-- -- Caution in general comult needn't be commutative, nor -- coassociative. comult :: Coalgebra a c => Cov a c -> Cov a c -> Cov a c infixr 7 `comult` -- | A linear transformation between free semimodules indexed with bases -- b and c. -- --
--   f !# x + y = (f !# x) + (f !# y)
--   f !# (r .* x) = r .* (f !# x)
--   
-- -- Caution: You must ensure these laws hold when using the default -- constructor. -- -- Prefer image or tran where appropriate. newtype Lin a b c Lin :: ((c -> a) -> b -> a) -> Lin a b c [runLin] :: Lin a b c -> (c -> a) -> b -> a -- | An endomorphism over a free semimodule. -- --
--   >>> one + two !# V2 1 2 :: V2 Double
--   V2 3.0 6.0
--   
type End a b = Lin a b b -- | Create a Lin from a linear combination of basis vectors. -- --
--   >>> image (e2 [(2, E31),(3, E32)] [(1, E33)]) !# V3 1 1 1 :: V2 Int
--   V2 5 1
--   
image :: Semiring a => (b -> [(a, c)]) -> Lin a b c -- | Lin is an invariant functor. -- -- See also http://comonad.com/reader/2008/rotten-bananas/. invmap :: (a1 -> a2) -> (a2 -> a1) -> Lin a1 b c -> Lin a2 b c -- | The augmentation ring homomorphism. augment :: Semiring a => Lin a b c -> b -> a -- | Apply a transformation to a vector. (!#) :: Free f => Free g => Lin a (Rep f) (Rep g) -> g a -> f a infixr 2 !# -- | Apply a transformation to a vector. (#!) :: Free f => Free g => g a -> Lin a (Rep f) (Rep g) -> f a infixl 2 #! -- | Compose two transformations. -- -- !#! = <<< (!#!) :: Lin a c d -> Lin a b c -> Lin a b d infixr 2 !#! -- | Swap components of a tensor product. -- -- This is equivalent to a matrix transpose. braid :: Lin a (b, c) (c, b) -- | Swap components of a direct sum. cobraid :: Lin a (b + c) (c + b) -- | TODO: Document split :: (b -> (b1, b2)) -> Lin a b1 c -> Lin a b2 c -> Lin a b c -- | TODO: Document cosplit :: ((c1 + c2) -> c) -> Lin a b c1 -> Lin a b c2 -> Lin a b c -- | Project onto the left-hand component of a direct sum. projl :: Free f => Free g => (f ++ g) a -> f a -- | Project onto the right-hand component of a direct sum. projr :: Free f => Free g => (f ++ g) a -> g a -- | Left (post) composition with a linear transformation. compl :: Free f1 => Free f2 => Free g => Lin a (Rep f1) (Rep f2) -> (f2 ** g) a -> (f1 ** g) a -- | Right (pre) composition with a linear transformation. compr :: Free f => Free g1 => Free g2 => Lin a (Rep g1) (Rep g2) -> (f ** g2) a -> (f ** g1) a -- | Left and right composition with a linear transformation. -- --
--   complr f g = compl f >>> compr g
--   
complr :: Free f1 => Free f2 => Free g1 => Free g2 => Lin a (Rep f1) (Rep f2) -> Lin a (Rep g1) (Rep g2) -> (f2 ** g2) a -> (f1 ** g1) a -- |
--   rmap (((c1,()),(c2,())) -> (c1,c2)) $ (id *** initial) . diagonal = id
--   rmap ((((),c1),((),c2)) -> (c1,c2)) $ (initial *** id) . diagonal = id
--   
diagonal :: Algebra a b => Lin a b (b, b) -- |
--   lmap ((c1,c2) -> ((c1,()),(c2,()))) $ (id *** coinitial) . codiagonal = id
--   lmap ((c1,c2) -> (((),c1),((),c2))) $ (coinitial *** id) . codiagonal = id
--   
codiagonal :: Coalgebra a c => Lin a (c, c) c -- | TODO: Document initial :: Unital a b => Lin a b () -- | TODO: Document coinitial :: Counital a c => Lin a () c -- | Convolution with an associative algebra and coassociative coalgebra convolve :: Algebra a b => Coalgebra a c => Lin a b c -> Lin a b c -> Lin a b c instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.Vec a b) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.Vec a b) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.Vec a b) instance Data.Semimodule.Counital a b => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.Cov a b) instance Data.Semimodule.Counital a b => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.Cov a b) instance Data.Semimodule.Counital a b => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.End a b) (Data.Semimodule.Free.Cov a b) instance Data.Semiring.Presemiring a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semimodule.Free.End a b)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semimodule.Free.End a b)) instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.End a b) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.End a b) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.End a b) instance GHC.Base.Functor (Data.Semimodule.Free.Lin a b) instance Control.Category.Category (Data.Semimodule.Free.Lin a) instance Data.Functor.Bind.Class.Apply (Data.Semimodule.Free.Lin a b) instance GHC.Base.Applicative (Data.Semimodule.Free.Lin a b) instance Data.Profunctor.Unsafe.Profunctor (Data.Semimodule.Free.Lin a) instance Data.Profunctor.Strong.Strong (Data.Semimodule.Free.Lin a) instance Data.Profunctor.Choice.Choice (Data.Semimodule.Free.Lin a) instance Data.Profunctor.Sieve.Sieve (Data.Semimodule.Free.Lin a) (Data.Semimodule.Free.Cov a) instance Data.Profunctor.Rep.Representable (Data.Semimodule.Free.Lin a) instance GHC.Base.Monad (Data.Semimodule.Free.Lin a b) instance Control.Arrow.Arrow (Data.Semimodule.Free.Lin a) instance Control.Arrow.ArrowChoice (Data.Semimodule.Free.Lin a) instance Control.Arrow.ArrowApply (Data.Semimodule.Free.Lin a) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Free.Lin a b c)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Free.Lin a b c)) instance Data.Semimodule.Counital a b => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.Lin a b b) (Data.Semimodule.Free.Lin a b c) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.Lin a b c) instance Data.Semimodule.Counital a c => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.Lin a c c) (Data.Semimodule.Free.Lin a b c) instance (Data.Semimodule.Counital a b, Data.Semimodule.Counital a c) => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.Lin a b b) (Data.Semimodule.Free.Lin a c c) (Data.Semimodule.Free.Lin a b c) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.Lin a b m) instance Data.Semimodule.Bisemimodule a a a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.Lin a b c) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Free.Lin a b c)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Free.Lin a b c)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Free.Lin a b c)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Free.Lin a b c)) instance GHC.Base.Functor (Data.Semimodule.Free.Cov a) instance GHC.Base.Applicative (Data.Semimodule.Free.Cov a) instance GHC.Base.Monad (Data.Semimodule.Free.Cov a) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Alternative (Data.Semimodule.Free.Cov a) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.MonadPlus (Data.Semimodule.Free.Cov a) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Free.Cov a b)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Free.Cov a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Free.Cov a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Free.Cov a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Free.Cov a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Free.Cov a b)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.Cov a b) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.Cov a b) instance Data.Semimodule.Bisemimodule a a a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.Cov a b) instance Data.Functor.Contravariant.Contravariant (Data.Semimodule.Free.Vec a) instance Control.Category.Category Data.Semimodule.Free.Vec instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Free.Vec a b)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Free.Vec a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Free.Vec a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Free.Vec a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Free.Vec a b)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Free.Vec a b)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.Vec a b) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.Vec a b) instance Data.Semimodule.Bisemimodule a a a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.Vec a b) module Data.Semimodule.Combinator -- | Retrieve the coefficient of a basis element -- --
--   >>> elt E21 (V2 1 2)
--   1
--   
elt :: Free f => Rep f -> f a -> a -- | Obtain a vector from an array of coefficients and a basis. vec :: Free f => f a -> Vec a (Rep f) -- | Obtain a covector from an array of coefficients and a basis. -- --
--   >>> cov (V2 7 4) !* vec (V2 1 2) :: Int
--   11
--   
cov :: FreeCounital a f => f a -> Cov a (Rep f) -- | Insert an element into an algebra. -- -- When the algebra is trivial this is equal to pureRep. -- --
--   >>> V4 1 2 3 4 .*. unit two :: V4 Int
--   V4 2 4 6 8
--   
unit :: FreeUnital a f => a -> f a -- | Unital element of a unital algebra over a free semimodule. -- --
--   >>> unit' :: Complex Int
--   1 :+ 0
--   
unit' :: FreeUnital a f => f a -- | Obtain an element from a coalgebra over a free semimodule. counit :: FreeCounital a f => f a -> a -- | Create a unit vector at an index. -- --
--   >>> dirac E21 :: V2 Int
--   V2 1 0
--   
-- --
--   >>> dirac E42 :: V4 Int
--   V4 0 1 0 0
--   
dirac :: Semiring a => Free f => Eq (Rep f) => Rep f -> f a -- | Create a lens from a representable functor. lensRep :: Free f => Eq (Rep f) => Rep f -> forall g. Functor g => (a -> g a) -> f a -> g (f a) -- | Create an indexed grate from a representable functor. grateRep :: Free f => forall g. Functor g => (Rep f -> g a1 -> a2) -> g (f a1) -> f a2 -- | Right-multiply a module element by a scalar. (.*) :: RightSemimodule r a => a -> r -> a infixl 7 .* -- | Left-multiply a module element by a scalar. (*.) :: LeftSemimodule l a => l -> a -> a infixr 7 *. -- | Multiplication operator on an algebra over a free semimodule. -- -- Caution in general .*. needn't be commutative, nor -- associative. (.*.) :: FreeAlgebra a f => f a -> f a -> f a infixl 7 .*. -- | Apply a covector to a vector on the right. (!*) :: Vec a b -> Cov a b -> a infixr 7 !* -- | Apply a covector to a vector on the left. (*!) :: Cov a b -> Vec a b -> a infixl 7 *! -- | Multiplication operator on an algebra over a free semimodule. -- --
--   >>> flip runVec E22 $ (vec $ V2 1 2) !*! (vec $ V2 7 4)
--   8
--   
-- -- Caution in general mult needn't be commutative, nor -- associative. (!*!) :: Algebra a b => Vec a b -> Vec a b -> Vec a b infixr 7 !*! -- | Use a linear transformation to map over a vector space. -- -- Note that the basis transforms -- https://en.wikipedia.org/wiki/Covariant_transformation#Contravariant_transformation -- contravariantly. vmap :: Lin a b c -> Vec a c -> Vec a b -- | Use a linear transformation to map over a dual space. -- -- Note that the basis transforms covariantly. cmap :: Lin a b c -> Cov a b -> Cov a c -- | Inner product. -- -- When the coalgebra is trivial this is a variant of xmult -- restricted to free functors. -- --
--   >>> V3 1 2 3 `inner` V3 1 2 3
--   14
--   
inner :: FreeCounital a f => f a -> f a -> a infix 6 `inner` -- | Outer product. -- --
--   >>> V2 1 1 `outer` V2 1 1
--   Compose (V2 (V2 1 1) (V2 1 1))
--   
outer :: Semiring a => Free f => Free g => f a -> g a -> (f ** g) 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 :: LeftModule r a => r -> a -> a -> a -- | Squared l2 norm of a vector. quadrance :: FreeCounital a f => f a -> a -- | Obtain a linear linsformation from a matrix. -- --
--   (.#) = (!#) . lin
--   
lin :: Free f => FreeCounital a g => (f ** g) a -> Lin a (Rep f) (Rep g) -- | Retrieve an element of a matrix. -- --
--   >>> elt2 E21 E21 $ m22 1 2 3 4
--   1
--   
elt2 :: Free f => Free g => Rep f -> Rep g -> (f ** g) a -> a -- | Retrieve a row of a matrix. -- --
--   >>> row E22 $ m23 1 2 3 4 5 6
--   V3 4 5 6
--   
row :: Free f => Rep f -> (f ** g) a -> g 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 matrix. -- --
--   >>> elt E22 . col E31 $ m23 1 2 3 4 5 6
--   4
--   
col :: Free f => Free 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 -- | Obtain a vector from a tensor. -- -- When the algebra is trivial we have: -- --
--   diag f = tabulate $ joined (index . index (getCompose f))
--   
-- --
--   >>> diag $ m22 1.0 2.0 3.0 4.0
--   V2 1.0 4.0
--   
diag :: FreeAlgebra a f => (f ** f) a -> f a -- | Obtain a tensor from a vector. -- -- When the coalgebra is trivial we have: -- --
--   codiag = flip bindRep id . getCompose
--   
codiag :: FreeCoalgebra a f => f a -> (f ** f) a -- | Obtain a scalar matrix from a scalar. -- --
--   >>> scalar 4.0 :: M22 Double
--   Compose (V2 (V2 4.0 0.0) (V2 0.0 4.0))
--   
scalar :: FreeCoalgebra a f => a -> (f ** f) a -- | Obtain an identity matrix. -- --
--   >>> identity :: M33 Int
--   Compose (V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1))
--   
identity :: FreeCoalgebra a f => (f ** f) a -- | Multiply a matrix on the right by a column vector. -- --
--   (.#) = (!#) . lin
--   
-- --
--   >>> lin (m23 1 2 3 4 5 6) !# V3 7 8 9 :: V2 Int
--   V2 50 122
--   
--   >>> m23 1 2 3 4 5 6 .# V3 7 8 9 :: V2 Int
--   V2 50 122
--   
--   >>> m22 1 0 0 0 .# m23 1 2 3 4 5 6 .# V3 7 8 9 :: V2 Int
--   V2 50 0
--   
(.#) :: Free f => FreeCounital a g => (f ** g) a -> g a -> f a infixr 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 Int
--   V2 15 0
--   
(#.) :: FreeCounital a f => Free g => f a -> (f ** g) a -> g a infixl 7 #. -- | Apply a transformation to a vector. (#!) :: Free f => Free g => g a -> Lin a (Rep f) (Rep g) -> f a infixl 2 #! -- | Apply a transformation to a vector. (!#) :: Free f => Free g => Lin a (Rep f) (Rep g) -> g a -> f a infixr 2 !# -- | Multiply two matrices. -- --
--   >>> m22 1 2 3 4 .#. m22 1 2 3 4 :: M22 Int
--   Compose (V2 (V2 7 10) (V2 15 22))
--   
-- --
--   >>> m23 1 2 3 4 5 6 .#. m32 1 2 3 4 4 5 :: M22 Int
--   Compose (V2 (V2 19 25) (V2 43 58))
--   
(.#.) :: Free f => FreeCounital a g => Free h => (f ** g) a -> (g ** h) a -> (f ** h) a infixr 7 .#. -- | Trace of an endomorphism. -- --
--   >>> trace $ m22 1.0 2.0 3.0 4.0
--   5.0
--   
trace :: FreeBialgebra a f => (f ** f) a -> a -- | Transpose a matrix. -- --
--   >>> 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 module Data.Semimodule.Basis type Basis b f = (Free f, Rep f ~ b, Eq b) type Basis2 b c f g = (Basis b f, Basis c g) type Basis3 b c d f g h = (Basis b f, Basis c g, Basis d h) data E1 E11 :: E1 e1 :: a -> E1 -> a fillE1 :: Basis E1 f => a -> f a data E2 E21 :: E2 E22 :: E2 e2 :: a -> a -> E2 -> a fillE2 :: Basis E2 f => a -> a -> f a data E3 E31 :: E3 E32 :: E3 E33 :: E3 e3 :: a -> a -> a -> E3 -> a fillE3 :: Basis E3 f => a -> a -> a -> f a data E4 E41 :: E4 E42 :: E4 E43 :: E4 E44 :: E4 e4 :: a -> a -> a -> a -> E4 -> a fillE4 :: Basis E4 f => a -> a -> a -> a -> f a instance GHC.Show.Show Data.Semimodule.Basis.E4 instance GHC.Classes.Ord Data.Semimodule.Basis.E4 instance GHC.Classes.Eq Data.Semimodule.Basis.E4 instance GHC.Show.Show Data.Semimodule.Basis.E3 instance GHC.Classes.Ord Data.Semimodule.Basis.E3 instance GHC.Classes.Eq Data.Semimodule.Basis.E3 instance GHC.Show.Show Data.Semimodule.Basis.E2 instance GHC.Classes.Ord Data.Semimodule.Basis.E2 instance GHC.Classes.Eq Data.Semimodule.Basis.E2 instance GHC.Show.Show Data.Semimodule.Basis.E1 instance GHC.Classes.Ord Data.Semimodule.Basis.E1 instance GHC.Classes.Eq Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Unital r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Coalgebra r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Counital r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Bialgebra r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Unital r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Coalgebra r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Counital r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Bialgebra r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Unital r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Coalgebra r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Counital r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Bialgebra r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Unital r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Coalgebra r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Counital r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Bialgebra r Data.Semimodule.Basis.E1 module Data.Semimodule.Finite newtype V1 a V1 :: a -> V1 a unV1 :: V1 a -> a data V2 a V2 :: !a -> !a -> V2 a data V3 a V3 :: !a -> !a -> !a -> V3 a -- | Cross product. -- --
--   a `cross' a = zero
--   a `cross' b = negate ( b `cross' a ) , 
--   a `cross' ( b + c ) = ( a `cross' b ) + ( a `cross' c ) , 
--   ( r a ) `cross' b = a `cross' ( r b ) = r ( a `cross' b ) . 
--   a `cross' ( b `cross' c ) + b `cross' ( c `cross' a ) + c `cross' ( a `cross' b ) = zero . 
--   
-- -- See Jacobi identity. cross :: Ring a => V3 a -> V3 a -> V3 a -- | 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 `cross' y) `cross' (x `cross' z)
--   
-- --
--   >>> triple (V3 0 0 1) (V3 1 0 0) (V3 0 1 0) :: Double
--   1.0
--   
triple :: Ring a => V3 a -> V3 a -> V3 a -> a data V4 a V4 :: !a -> !a -> !a -> !a -> V4 a -- | A 1x1 matrix. type M11 = Compose V1 V1 -- | A 1x2 matrix. type M12 = Compose V1 V2 -- | A 1x3 matrix. type M13 = Compose V1 V3 -- | A 1x4 matrix. type M14 = Compose V1 V4 -- | A 2x1 matrix. type M21 = Compose V2 V1 -- | A 3x1 matrix. type M31 = Compose V3 V1 -- | A 4x1 matrix. type M41 = Compose V4 V1 -- | A 2x2 matrix. type M22 = Compose V2 V2 -- | A 2x3 matrix. type M23 = Compose V2 V3 -- | A 2x4 matrix. type M24 = Compose V2 V4 -- | A 3x2 matrix. type M32 = Compose V3 V2 -- | A 3x3 matrix. type M33 = Compose V3 V3 -- | A 3x4 matrix. type M34 = Compose V3 V4 -- | A 4x2 matrix. type M42 = Compose V4 V2 -- | A 4x3 matrix. type M43 = Compose V4 V3 -- | A 4x4 matrix. type M44 = Compose V4 V4 -- | Construct a 1x1 matrix. -- --
--   >>> m11 1 :: M11 Int
--   Compose (V1 (V1 1))
--   
m11 :: a -> M11 a -- | Construct a 1x2 matrix. -- --
--   >>> m12 1 2 :: M12 Int
--   Compose (V1 (V2 1 2))
--   
m12 :: a -> a -> M12 a -- | Construct a 1x3 matrix. -- --
--   >>> m13 1 2 3 :: M13 Int
--   Compose (V1 (V3 1 2 3))
--   
m13 :: a -> a -> a -> M13 a -- | Construct a 1x4 matrix. -- --
--   >>> m14 1 2 3 4 :: M14 Int
--   Compose (V1 (V4 1 2 3 4))
--   
m14 :: a -> a -> a -> a -> M14 a -- | Construct a 2x1 matrix. -- --
--   >>> m21 1 2 :: M21 Int
--   Compose (V2 (V1 1) (V1 2))
--   
m21 :: a -> a -> M21 a -- | Construct a 3x1 matrix. -- --
--   >>> m31 1 2 3 :: M31 Int
--   Compose (V3 (V1 1) (V1 2) (V1 3))
--   
m31 :: a -> a -> a -> M31 a -- | Construct a 4x1 matrix. -- --
--   >>> m41 1 2 3 4 :: M41 Int
--   Compose (V4 (V1 1) (V1 2) (V1 3) (V1 4))
--   
m41 :: a -> a -> a -> a -> M41 a -- | Construct a 2x2 matrix. -- -- Arguments are in row-major order. -- --
--   >>> m22 1 2 3 4 :: M22 Int
--   Compose (V2 (V2 1 2) (V2 3 4))
--   
m22 :: a -> a -> a -> a -> M22 a -- | Construct a 2x3 matrix. -- -- Arguments are in row-major order. m23 :: a -> a -> a -> a -> a -> a -> M23 a -- | Construct a 2x4 matrix. -- -- Arguments are in row-major order. m24 :: a -> a -> a -> a -> a -> a -> a -> a -> M24 a -- | Construct a 3x2 matrix. -- -- Arguments are in row-major order. m32 :: a -> a -> a -> a -> a -> a -> M32 a -- | Construct a 3x3 matrix. -- -- Arguments are in row-major order. m33 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> M33 a -- | Construct a 3x4 matrix. -- -- Arguments are in row-major order. m34 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> M34 a -- | Construct a 4x2 matrix. -- -- Arguments are in row-major order. m42 :: a -> a -> a -> a -> a -> a -> a -> a -> M42 a -- | Construct a 4x3 matrix. -- -- Arguments are in row-major order. m43 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> M43 a -- | Construct a 4x4 matrix. -- -- Arguments are in row-major order. m44 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> M44 a -- | 1x1 matrix inverse over a field. -- --
--   >>> inv1 $ m11 4.0 :: M11 Double
--   Compose (V1 (V1 0.25))
--   
inv1 :: Field a => M11 a -> M11 a -- | 2x2 matrix inverse over a field. -- --
--   >>> inv2 $ m22 1 2 3 4 :: M22 Double
--   Compose (V2 (V2 (-2.0) 1.0) (V2 1.5 (-0.5)))
--   
inv2 :: Field a => M22 a -> M22 a -- | 2x2 matrix bdeterminant over a commutative semiring. -- --
--   >>> bdet2 $ m22 1 2 3 4
--   (4,6)
--   
bdet2 :: Semiring a => Basis2 E2 E2 f 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 => Basis2 E2 E2 f g => (f ** g) a -> 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 => Basis2 E3 E3 f 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 $ m33 1 2 3 4 5 6 7 8 9
--   0
--   
det3 :: Ring a => Basis2 E3 E3 f g => (f ** g) a -> a -- | 3x3 matrix inverse. -- --
--   >>> inv3 $ m33 1 2 4 4 2 2 1 1 1 :: M33 Double
--   Compose (V3 (V3 0.0 0.5 (-1.0)) (V3 (-0.5) (-0.75) 3.5) (V3 0.5 0.25 (-1.5)))
--   
inv3 :: Field a => M33 a -> M33 a -- | 4x4 matrix bdeterminant over a commutative semiring. -- --
--   >>> bdet4 $ m44 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
--   (27728,27728)
--   
bdet4 :: Semiring a => Basis2 E4 E4 f 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 :: Rational
--   (-12) % 1
--   
det4 :: Ring a => Basis2 E4 E4 f g => (f ** g) a -> a -- | 4x4 matrix inverse. -- --
--   >>> row E41 . inv4 $ m44 1 0 3 2 2 0 2 1 0 0 0 1 0 3 4 0 :: V4 Rational
--   V4 (6 % (-12)) ((-9) % (-12)) ((-3) % (-12)) (0 % (-12))
--   
inv4 :: Field a => M44 a -> M44 a instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Finite.V4 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Finite.V4 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Finite.V4 a) instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Finite.V3 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Finite.V3 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Finite.V3 a) instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Finite.V2 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Finite.V2 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Finite.V2 a) instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Finite.V1 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Finite.V1 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Finite.V1 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M41 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M41 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M42 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M42 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M43 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M43 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M14 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M14 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M24 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M24 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M34 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M34 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M44 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M44 a) (Data.Semimodule.Finite.M44 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M44 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M44 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Finite.M44 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Finite.M44 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Finite.M44 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M43 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M42 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M34 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M31 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M31 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M32 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M32 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M13 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M13 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M23 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M23 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M33 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M33 a) (Data.Semimodule.Finite.M33 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M33 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M33 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Finite.M33 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Finite.M33 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Finite.M33 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M32 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M24 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M23 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M21 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M21 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M12 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M12 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M22 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M22 a) (Data.Semimodule.Finite.M22 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M22 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M22 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Finite.M22 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Finite.M22 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Finite.M22 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M41 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M31 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M21 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M14 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M13 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M12 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M11 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Finite.M11 a) (Data.Semimodule.Finite.M11 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M11 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Multiplicative (Data.Semimodule.Finite.M11 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Finite.M11 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Finite.M11 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Finite.M11 a) instance Data.Functor.Classes.Show1 Data.Semimodule.Finite.V4 instance GHC.Base.Functor Data.Semimodule.Finite.V4 instance GHC.Base.Applicative Data.Semimodule.Finite.V4 instance Data.Foldable.Foldable Data.Semimodule.Finite.V4 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Finite.V4 instance Data.Distributive.Distributive Data.Semimodule.Finite.V4 instance Data.Functor.Rep.Representable Data.Semimodule.Finite.V4 instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V4 a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Finite.V4 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Finite.V4 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V4 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Finite.V4 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Finite.V4 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Finite.V4 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Finite.V4 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Finite.V4 a) instance Data.Functor.Classes.Eq1 Data.Semimodule.Finite.V3 instance Data.Functor.Classes.Show1 Data.Semimodule.Finite.V3 instance GHC.Base.Functor Data.Semimodule.Finite.V3 instance GHC.Base.Applicative Data.Semimodule.Finite.V3 instance Data.Foldable.Foldable Data.Semimodule.Finite.V3 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Finite.V3 instance Data.Distributive.Distributive Data.Semimodule.Finite.V3 instance Data.Functor.Rep.Representable Data.Semimodule.Finite.V3 instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V3 a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Finite.V3 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Finite.V3 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V3 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Finite.V3 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Finite.V3 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Finite.V3 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Finite.V3 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Finite.V3 a) instance Data.Functor.Classes.Show1 Data.Semimodule.Finite.V2 instance GHC.Base.Functor Data.Semimodule.Finite.V2 instance GHC.Base.Applicative Data.Semimodule.Finite.V2 instance Data.Foldable.Foldable Data.Semimodule.Finite.V2 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Finite.V2 instance Data.Distributive.Distributive Data.Semimodule.Finite.V2 instance Data.Functor.Rep.Representable Data.Semimodule.Finite.V2 instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V2 a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Finite.V2 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Finite.V2 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V2 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Finite.V2 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Finite.V2 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Finite.V2 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Finite.V2 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Finite.V2 a) instance Data.Functor.Classes.Show1 Data.Semimodule.Finite.V1 instance GHC.Base.Functor Data.Semimodule.Finite.V1 instance GHC.Base.Applicative Data.Semimodule.Finite.V1 instance Data.Foldable.Foldable Data.Semimodule.Finite.V1 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Finite.V1 instance Data.Distributive.Distributive Data.Semimodule.Finite.V1 instance Data.Functor.Rep.Representable Data.Semimodule.Finite.V1 instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V1 a)) instance (Data.Semiring.-) Data.Semiring.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semiring.Additive (Data.Semimodule.Finite.V1 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semiring.Additive (Data.Semimodule.Finite.V1 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semiring.Additive (Data.Semimodule.Finite.V1 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Loop (Data.Semiring.Additive (Data.Semimodule.Finite.V1 a)) instance (Data.Semiring.-) Data.Semiring.Additive Data.Group.Group a => Data.Group.Group (Data.Semiring.Additive (Data.Semimodule.Finite.V1 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Finite.V1 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Finite.V1 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Finite.V1 a) -- | 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. -- -- 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> -- -- A semigroup must right-associate addition. -- -- This is a required property for semigroups. 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> -- -- A semigroup must right-associate multiplication. -- -- This is a required property for semigroups. 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_on and the universality of folds. distributive_finite1_on :: Presemiring r => Foldable1 f => Rel r b -> f r -> r -> b -- | This is a required property for additive semigroup morphisms. morphism_additive_on :: (Additive - Semigroup) r => (Additive - Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b -- | This is a required property for multiplicative semigroup morphisms. morphism_multiplicative_on :: (Multiplicative - Semigroup) r => (Multiplicative - Semigroup) s => Rel s b -> (r -> s) -> 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 -- | <math> -- -- A semigroup with a right-neutral additive identity must satisfy: -- --
--   neutral_addition_on (==) zero r = 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_on (==) one r = True
--   
-- -- Or, equivalently: -- --
--   one * r = r
--   
-- -- This is a required property 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
--   
-- -- 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_on & neutral_multiplication_on. distributive_finite_on :: Semiring r => Foldable f => Rel r b -> f r -> r -> b -- | This is a required property for additive monoid morphisms. morphism_additive_on' :: (Additive - Monoid) r => (Additive - Monoid) s => Rel s b -> (r -> s) -> b -- | This is a required property for multiplicative monoid morphisms. morphism_multiplicative_on' :: (Multiplicative - Monoid) r => (Multiplicative - Monoid) s => Rel s b -> (r -> s) -> 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> -- -- If R is also left-distributive then it supports -- xmult-multiplication. distributive_xmult_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) -- xmult-multiplication. distributive_xmult1_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 and 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 -- | Idempotency property for additive semigroups. -- -- See https://en.wikipedia.org/wiki/Band_(mathematics). -- -- This is a an optional property for semigroups and semirings. -- -- This is a required property for lattices. idempotent_addition_on :: (Additive - Semigroup) r => Rel r b -> r -> b -- | Idempotency property for multplicative semigroups. -- -- See https://en.wikipedia.org/wiki/Band_(mathematics). -- -- This is a an optional property for semigroups and semirings. -- -- This is a required property for lattices. idempotent_multiplication_on :: (Multiplicative - Semigroup) r => Rel r b -> r -> b