-- 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.2 module Data.Semigroup.Additive -- | Hyphenation operator. type ( g - f ) a = f (g a) infixr 1 - -- | A commutative Semigroup under +. newtype Additive a Additive :: a -> Additive a [unAdditive] :: Additive a -> a -- | Additive unit of a semiring. zero :: (Additive - Monoid) a => 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 +
-- | Subtract two elements.
subtract :: (Additive - Group) a => a -> a -> a
-- | A (potentially non-commutative) Semigroup under *.
newtype Multiplicative a
Multiplicative :: a -> Multiplicative a
[unMultiplicative] :: Multiplicative a -> a
-- | Multiplicative unit of a semiring.
one :: (Multiplicative - Monoid) a => a
-- | Multiplicative semigroup operation on a semiring.
--
--
-- >>> Dual [2] * Dual [3] :: Dual [Int]
-- Dual {getDual = [5]}
--
(*) :: (Multiplicative - Semigroup) 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 -- | 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 \\ instance GHC.Base.Functor Data.Semigroup.Additive.Multiplicative instance GHC.Show.Show a => GHC.Show.Show (Data.Semigroup.Additive.Multiplicative a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semigroup.Additive.Multiplicative a) instance GHC.Generics.Generic (Data.Semigroup.Additive.Multiplicative a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semigroup.Additive.Multiplicative a) instance GHC.Base.Functor Data.Semigroup.Additive.Additive instance GHC.Show.Show a => GHC.Show.Show (Data.Semigroup.Additive.Additive a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semigroup.Additive.Additive a) instance GHC.Generics.Generic (Data.Semigroup.Additive.Additive a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semigroup.Additive.Additive a) instance GHC.Base.Applicative Data.Semigroup.Additive.Multiplicative instance Data.Distributive.Distributive Data.Semigroup.Additive.Multiplicative instance Data.Functor.Rep.Representable Data.Semigroup.Additive.Multiplicative instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative Data.Group.Group a) => Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative Data.Group.Group a) => Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative Data.Group.Group a) => Data.Group.Loop (Data.Semigroup.Additive.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative Data.Group.Group a) => Data.Group.Group (Data.Semigroup.Additive.Multiplicative (Data.Complex.Complex a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => Data.Magma.Magma (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => Data.Group.Loop (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => Data.Group.Group (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative [a]) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative [a]) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (GHC.Base.NonEmpty a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semigroup.Min a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semigroup.Min a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Int) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Int.Int8) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Int.Int16) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Int.Int32) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Int.Int64) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Integer.Type.Integer) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Word) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Word.Word8) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Word.Word16) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Word.Word32) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Word.Word64) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Natural.Natural) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Uni) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Deci) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Centi) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Milli) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Micro) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Nano) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Pico) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Float) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CFloat) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Double) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CDouble) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Types.Int) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Int.Int8) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Int.Int16) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Int.Int32) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Int.Int64) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Integer.Type.Integer) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Types.Word) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Word.Word8) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Word.Word16) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Word.Word32) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Word.Word64) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Natural.Natural) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Uni) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Deci) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Centi) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Milli) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Micro) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Nano) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Data.Fixed.Pico) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Types.Float) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CFloat) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Types.Double) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CDouble) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Uni) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Deci) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Centi) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Milli) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Micro) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Nano) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Data.Fixed.Pico) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative GHC.Types.Float) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CFloat) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative GHC.Types.Double) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Uni) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Deci) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Centi) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Milli) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Micro) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Nano) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Data.Fixed.Pico) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Float) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Double) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Uni) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Deci) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Centi) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Milli) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Micro) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Nano) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Data.Fixed.Pico) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative GHC.Types.Float) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative GHC.Types.Double) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CDouble) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Uni) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Deci) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Centi) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Milli) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Micro) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Nano) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Data.Fixed.Pico) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative GHC.Types.Float) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CFloat) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative GHC.Types.Double) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative Foreign.C.Types.CDouble) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => Data.Group.Loop (Data.Semigroup.Additive.Multiplicative (GHC.Real.Ratio a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => Data.Group.Group (Data.Semigroup.Additive.Multiplicative (GHC.Real.Ratio a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative ()) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative ()) instance Data.Magma.Magma (Data.Semigroup.Additive.Multiplicative ()) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Multiplicative ()) instance Data.Group.Loop (Data.Semigroup.Additive.Multiplicative ()) instance Data.Group.Group (Data.Semigroup.Additive.Multiplicative ()) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative GHC.Types.Bool) instance GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative GHC.Types.Bool) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semigroup.Internal.Dual a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semigroup.Internal.Dual a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Ord.Down a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Ord.Down a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semigroup.Max a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semigroup.Max a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (a, b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup b => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid b => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (GHC.Maybe.Maybe a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (GHC.Maybe.Maybe a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Either.Either a b)) instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Map.Internal.Map k a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative Data.IntSet.Internal.IntSet) instance (GHC.Classes.Ord k, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid k, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a) => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Map.Internal.Map k a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Applicative Data.Semigroup.Additive.Additive instance Data.Distributive.Distributive Data.Semigroup.Additive.Additive instance Data.Functor.Rep.Representable Data.Semigroup.Additive.Additive instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Int) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Word) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word8) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word16) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word32) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Word.Word64) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Natural.Natural) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Float) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Double) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Int) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Word) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word8) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word16) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word32) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Word.Word64) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Natural.Natural) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Float) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Double) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Group.Loop (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Group.Loop (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Types.Int) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int8) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int16) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int32) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Int.Int64) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Integer.Type.Integer) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Uni) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Deci) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Centi) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Milli) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Micro) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Nano) instance Data.Group.Group (Data.Semigroup.Additive.Additive Data.Fixed.Pico) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Types.Float) instance Data.Group.Group (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat) instance Data.Group.Group (Data.Semigroup.Additive.Additive GHC.Types.Double) instance Data.Group.Group (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Complex.Complex a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group b => Data.Magma.Magma (Data.Semigroup.Additive.Additive (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group b => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group b => Data.Group.Loop (Data.Semigroup.Additive.Additive (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group b => Data.Group.Group (Data.Semigroup.Additive.Additive (a -> b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid b => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (a -> b)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive [a]) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive [a]) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (GHC.Base.NonEmpty a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Ord.Down a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Ord.Down a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive ()) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive ()) instance Data.Magma.Magma (Data.Semigroup.Additive.Additive ()) instance Data.Group.Quasigroup (Data.Semigroup.Additive.Additive ()) instance Data.Group.Loop (Data.Semigroup.Additive.Additive ()) instance Data.Group.Group (Data.Semigroup.Additive.Additive ()) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive GHC.Types.Bool) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive GHC.Types.Bool) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (a, b)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid b) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (a, b)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup c) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (a, b, c)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid b, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid c) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (a, b, c)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (GHC.Maybe.Maybe a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (GHC.Maybe.Maybe a)) instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Either.Either a b)) instance GHC.Classes.Ord a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Map.Internal.Map k a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.IntMap.Internal.IntMap a)) instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.IntSet.Internal.IntSet) instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.IntSet.Internal.IntSet) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.IntMap.Internal.IntMap a)) instance GHC.Classes.Ord a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Set.Internal.Set a)) instance (GHC.Classes.Ord k, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Map.Internal.Map k a)) module Data.Semigroup.Property -- | <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> -- -- 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> -- -- 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> -- -- 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> -- -- 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 -- | 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 -- | 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 module Data.Semiring -- | Hyphenation operator. type ( g - f ) a = f (g a) infixr 1 - 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 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 -- | 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 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 Data.Semiring.Ring a => Data.Semiring.Presemiring (Data.Complex.Complex a) instance Data.Semiring.Ring a => Data.Semiring.Semiring (Data.Complex.Complex a) instance Data.Semiring.Ring () instance Data.Semiring.Ring GHC.Types.Int instance Data.Semiring.Ring GHC.Int.Int8 instance Data.Semiring.Ring GHC.Int.Int16 instance Data.Semiring.Ring GHC.Int.Int32 instance Data.Semiring.Ring GHC.Int.Int64 instance Data.Semiring.Ring GHC.Integer.Type.Integer instance Data.Semiring.Ring (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semiring.Ring Data.Fixed.Uni instance Data.Semiring.Ring Data.Fixed.Deci instance Data.Semiring.Ring Data.Fixed.Centi instance Data.Semiring.Ring Data.Fixed.Milli instance Data.Semiring.Ring Data.Fixed.Micro instance Data.Semiring.Ring Data.Fixed.Nano instance Data.Semiring.Ring Data.Fixed.Pico instance Data.Semiring.Ring GHC.Types.Float instance Data.Semiring.Ring GHC.Types.Double instance Data.Semiring.Ring Foreign.C.Types.CFloat instance Data.Semiring.Ring Foreign.C.Types.CDouble instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Complex.Complex a) instance Data.Semiring.Semiring () instance Data.Semiring.Semiring GHC.Types.Bool instance Data.Semiring.Semiring GHC.Types.Word instance Data.Semiring.Semiring GHC.Word.Word8 instance Data.Semiring.Semiring GHC.Word.Word16 instance Data.Semiring.Semiring GHC.Word.Word32 instance Data.Semiring.Semiring GHC.Word.Word64 instance Data.Semiring.Semiring GHC.Natural.Natural instance Data.Semiring.Semiring (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semiring.Semiring GHC.Types.Int instance Data.Semiring.Semiring GHC.Int.Int8 instance Data.Semiring.Semiring GHC.Int.Int16 instance Data.Semiring.Semiring GHC.Int.Int32 instance Data.Semiring.Semiring GHC.Int.Int64 instance Data.Semiring.Semiring GHC.Integer.Type.Integer instance Data.Semiring.Semiring (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semiring.Semiring Data.Fixed.Uni instance Data.Semiring.Semiring Data.Fixed.Deci instance Data.Semiring.Semiring Data.Fixed.Centi instance Data.Semiring.Semiring Data.Fixed.Milli instance Data.Semiring.Semiring Data.Fixed.Micro instance Data.Semiring.Semiring Data.Fixed.Nano instance Data.Semiring.Semiring Data.Fixed.Pico instance Data.Semiring.Semiring GHC.Types.Float instance Data.Semiring.Semiring GHC.Types.Double instance Data.Semiring.Semiring Foreign.C.Types.CFloat instance Data.Semiring.Semiring Foreign.C.Types.CDouble instance Data.Semiring.Semiring a => Data.Semiring.Semiring (r -> a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (GHC.Maybe.Maybe a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semiring.Semiring [a] instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.IntMap.Internal.IntMap a) instance (GHC.Classes.Ord k, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Multiplicative GHC.Base.Monoid k, Data.Semiring.Semiring a) => Data.Semiring.Semiring (Data.Map.Internal.Map k a) instance Data.Semiring.Presemiring () instance Data.Semiring.Presemiring GHC.Types.Bool instance Data.Semiring.Presemiring GHC.Types.Word instance Data.Semiring.Presemiring GHC.Word.Word8 instance Data.Semiring.Presemiring GHC.Word.Word16 instance Data.Semiring.Presemiring GHC.Word.Word32 instance Data.Semiring.Presemiring GHC.Word.Word64 instance Data.Semiring.Presemiring GHC.Natural.Natural instance Data.Semiring.Presemiring (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semiring.Presemiring GHC.Types.Int instance Data.Semiring.Presemiring GHC.Int.Int8 instance Data.Semiring.Presemiring GHC.Int.Int16 instance Data.Semiring.Presemiring GHC.Int.Int32 instance Data.Semiring.Presemiring GHC.Int.Int64 instance Data.Semiring.Presemiring GHC.Integer.Type.Integer instance Data.Semiring.Presemiring (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semiring.Presemiring Data.Fixed.Uni instance Data.Semiring.Presemiring Data.Fixed.Deci instance Data.Semiring.Presemiring Data.Fixed.Centi instance Data.Semiring.Presemiring Data.Fixed.Milli instance Data.Semiring.Presemiring Data.Fixed.Micro instance Data.Semiring.Presemiring Data.Fixed.Nano instance Data.Semiring.Presemiring Data.Fixed.Pico instance Data.Semiring.Presemiring GHC.Types.Float instance Data.Semiring.Presemiring GHC.Types.Double instance Data.Semiring.Presemiring Foreign.C.Types.CFloat instance Data.Semiring.Presemiring Foreign.C.Types.CDouble instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (r -> a) instance (Data.Semiring.Presemiring a, Data.Semiring.Presemiring b) => Data.Semiring.Presemiring (Data.Either.Either a b) instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (GHC.Maybe.Maybe a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => Data.Semiring.Presemiring [a] instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => Data.Semiring.Presemiring (GHC.Base.NonEmpty a) instance Data.Semiring.Presemiring Data.IntSet.Internal.IntSet instance GHC.Classes.Ord a => Data.Semiring.Presemiring (Data.Set.Internal.Set a) instance Data.Semiring.Presemiring a => Data.Semiring.Presemiring (Data.IntMap.Internal.IntMap a) instance (GHC.Classes.Ord k, Data.Semiring.Presemiring a) => Data.Semiring.Presemiring (Data.Map.Internal.Map k a) module Data.Semifield 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: -- --
-- 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 a => Data.Semifield.Semifield (Data.Complex.Complex a) instance Data.Semifield.Field () instance Data.Semifield.Field GHC.Real.Rational instance Data.Semifield.Field Data.Fixed.Uni instance Data.Semifield.Field Data.Fixed.Deci instance Data.Semifield.Field Data.Fixed.Centi instance Data.Semifield.Field Data.Fixed.Milli instance Data.Semifield.Field Data.Fixed.Micro instance Data.Semifield.Field Data.Fixed.Nano instance Data.Semifield.Field Data.Fixed.Pico instance Data.Semifield.Field GHC.Types.Float instance Data.Semifield.Field GHC.Types.Double instance Data.Semifield.Field Foreign.C.Types.CFloat instance Data.Semifield.Field Foreign.C.Types.CDouble instance Data.Semifield.Field a => Data.Semifield.Field (Data.Complex.Complex a) instance Data.Semifield.Semifield () instance Data.Semifield.Semifield (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semifield.Semifield GHC.Real.Rational instance Data.Semifield.Semifield Data.Fixed.Uni instance Data.Semifield.Semifield Data.Fixed.Deci instance Data.Semifield.Semifield Data.Fixed.Centi instance Data.Semifield.Semifield Data.Fixed.Milli instance Data.Semifield.Semifield Data.Fixed.Micro instance Data.Semifield.Semifield Data.Fixed.Nano instance Data.Semifield.Semifield Data.Fixed.Pico instance Data.Semifield.Semifield GHC.Types.Float instance Data.Semifield.Semifield GHC.Types.Double instance Data.Semifield.Semifield Foreign.C.Types.CFloat instance Data.Semifield.Semifield Foreign.C.Types.CDouble module Data.Semimodule -- | A tensor product of semimodule morphisms. type f ** g = Compose f g infixr 2 ** -- | A direct sum of free semimodule elements. type f ++ g = Product f g infixr 1 ++ type Free f = (Representable f) 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) 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)) 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 -- | 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 type Bimodule l r a = (LeftModule l a, RightModule r a, Bisemimodule l r 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 instance Data.Semiring.Semiring r => Data.Semimodule.Bisemimodule r r () 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 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.Ring a => Data.Semimodule.Bisemimodule a a (Data.Complex.Complex a) instance Data.Semiring.Ring a => Data.Semimodule.Bisemimodule (Data.Complex.Complex a) (Data.Complex.Complex a) (Data.Complex.Complex a) instance Data.Semimodule.Bisemimodule GHC.Types.Bool GHC.Types.Bool GHC.Types.Bool instance Data.Semimodule.Bisemimodule GHC.Types.Int GHC.Types.Int GHC.Types.Int instance Data.Semimodule.Bisemimodule GHC.Int.Int8 GHC.Int.Int8 GHC.Int.Int8 instance Data.Semimodule.Bisemimodule GHC.Int.Int16 GHC.Int.Int16 GHC.Int.Int16 instance Data.Semimodule.Bisemimodule GHC.Int.Int32 GHC.Int.Int32 GHC.Int.Int32 instance Data.Semimodule.Bisemimodule GHC.Int.Int64 GHC.Int.Int64 GHC.Int.Int64 instance Data.Semimodule.Bisemimodule GHC.Types.Word GHC.Types.Word GHC.Types.Word instance Data.Semimodule.Bisemimodule GHC.Word.Word8 GHC.Word.Word8 GHC.Word.Word8 instance Data.Semimodule.Bisemimodule GHC.Word.Word16 GHC.Word.Word16 GHC.Word.Word16 instance Data.Semimodule.Bisemimodule GHC.Word.Word32 GHC.Word.Word32 GHC.Word.Word32 instance Data.Semimodule.Bisemimodule GHC.Word.Word64 GHC.Word.Word64 GHC.Word.Word64 instance Data.Semimodule.Bisemimodule Data.Fixed.Uni Data.Fixed.Uni Data.Fixed.Uni instance Data.Semimodule.Bisemimodule Data.Fixed.Deci Data.Fixed.Deci Data.Fixed.Deci instance Data.Semimodule.Bisemimodule Data.Fixed.Centi Data.Fixed.Centi Data.Fixed.Centi instance Data.Semimodule.Bisemimodule Data.Fixed.Milli Data.Fixed.Milli Data.Fixed.Milli instance Data.Semimodule.Bisemimodule Data.Fixed.Micro Data.Fixed.Micro Data.Fixed.Micro instance Data.Semimodule.Bisemimodule Data.Fixed.Nano Data.Fixed.Nano Data.Fixed.Nano instance Data.Semimodule.Bisemimodule Data.Fixed.Pico Data.Fixed.Pico Data.Fixed.Pico instance Data.Semimodule.Bisemimodule GHC.Types.Float GHC.Types.Float GHC.Types.Float instance Data.Semimodule.Bisemimodule GHC.Types.Double GHC.Types.Double GHC.Types.Double instance Data.Semimodule.Bisemimodule Foreign.C.Types.CFloat Foreign.C.Types.CFloat Foreign.C.Types.CFloat instance Data.Semimodule.Bisemimodule Foreign.C.Types.CDouble Foreign.C.Types.CDouble Foreign.C.Types.CDouble instance Data.Semimodule.Bisemimodule (GHC.Real.Ratio GHC.Integer.Type.Integer) (GHC.Real.Ratio GHC.Integer.Type.Integer) (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semimodule.Bisemimodule (GHC.Real.Ratio GHC.Natural.Natural) (GHC.Real.Ratio GHC.Natural.Natural) (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semiring.Semiring r => Data.Semimodule.RightSemimodule r () instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.RightSemimodule () a instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.RightSemimodule GHC.Natural.Natural a instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a) => Data.Semimodule.RightSemimodule GHC.Integer.Type.Integer a instance Data.Semimodule.RightSemimodule r a => Data.Semimodule.RightSemimodule r (e -> a) 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.Ring a => Data.Semimodule.RightSemimodule a (Data.Complex.Complex a) instance Data.Semiring.Ring a => Data.Semimodule.RightSemimodule (Data.Complex.Complex a) (Data.Complex.Complex a) instance Data.Semimodule.RightSemimodule GHC.Types.Bool GHC.Types.Bool instance Data.Semimodule.RightSemimodule GHC.Types.Int GHC.Types.Int instance Data.Semimodule.RightSemimodule GHC.Int.Int8 GHC.Int.Int8 instance Data.Semimodule.RightSemimodule GHC.Int.Int16 GHC.Int.Int16 instance Data.Semimodule.RightSemimodule GHC.Int.Int32 GHC.Int.Int32 instance Data.Semimodule.RightSemimodule GHC.Int.Int64 GHC.Int.Int64 instance Data.Semimodule.RightSemimodule GHC.Types.Word GHC.Types.Word instance Data.Semimodule.RightSemimodule GHC.Word.Word8 GHC.Word.Word8 instance Data.Semimodule.RightSemimodule GHC.Word.Word16 GHC.Word.Word16 instance Data.Semimodule.RightSemimodule GHC.Word.Word32 GHC.Word.Word32 instance Data.Semimodule.RightSemimodule GHC.Word.Word64 GHC.Word.Word64 instance Data.Semimodule.RightSemimodule Data.Fixed.Uni Data.Fixed.Uni instance Data.Semimodule.RightSemimodule Data.Fixed.Deci Data.Fixed.Deci instance Data.Semimodule.RightSemimodule Data.Fixed.Centi Data.Fixed.Centi instance Data.Semimodule.RightSemimodule Data.Fixed.Milli Data.Fixed.Milli instance Data.Semimodule.RightSemimodule Data.Fixed.Micro Data.Fixed.Micro instance Data.Semimodule.RightSemimodule Data.Fixed.Nano Data.Fixed.Nano instance Data.Semimodule.RightSemimodule Data.Fixed.Pico Data.Fixed.Pico instance Data.Semimodule.RightSemimodule GHC.Types.Float GHC.Types.Float instance Data.Semimodule.RightSemimodule GHC.Types.Double GHC.Types.Double instance Data.Semimodule.RightSemimodule Foreign.C.Types.CFloat Foreign.C.Types.CFloat instance Data.Semimodule.RightSemimodule Foreign.C.Types.CDouble Foreign.C.Types.CDouble instance Data.Semimodule.RightSemimodule (GHC.Real.Ratio GHC.Integer.Type.Integer) (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semimodule.RightSemimodule (GHC.Real.Ratio GHC.Natural.Natural) (GHC.Real.Ratio GHC.Natural.Natural) instance Data.Semiring.Semiring l => Data.Semimodule.LeftSemimodule l () instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.LeftSemimodule () a instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.LeftSemimodule GHC.Natural.Natural a instance ((Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a) => Data.Semimodule.LeftSemimodule GHC.Integer.Type.Integer a instance Data.Semimodule.LeftSemimodule l a => Data.Semimodule.LeftSemimodule l (e -> a) 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) instance Data.Semiring.Ring a => Data.Semimodule.LeftSemimodule (Data.Complex.Complex a) (Data.Complex.Complex a) instance Data.Semimodule.LeftSemimodule GHC.Types.Bool GHC.Types.Bool instance Data.Semimodule.LeftSemimodule GHC.Types.Int GHC.Types.Int instance Data.Semimodule.LeftSemimodule GHC.Int.Int8 GHC.Int.Int8 instance Data.Semimodule.LeftSemimodule GHC.Int.Int16 GHC.Int.Int16 instance Data.Semimodule.LeftSemimodule GHC.Int.Int32 GHC.Int.Int32 instance Data.Semimodule.LeftSemimodule GHC.Int.Int64 GHC.Int.Int64 instance Data.Semimodule.LeftSemimodule GHC.Types.Word GHC.Types.Word instance Data.Semimodule.LeftSemimodule GHC.Word.Word8 GHC.Word.Word8 instance Data.Semimodule.LeftSemimodule GHC.Word.Word16 GHC.Word.Word16 instance Data.Semimodule.LeftSemimodule GHC.Word.Word32 GHC.Word.Word32 instance Data.Semimodule.LeftSemimodule GHC.Word.Word64 GHC.Word.Word64 instance Data.Semimodule.LeftSemimodule Data.Fixed.Uni Data.Fixed.Uni instance Data.Semimodule.LeftSemimodule Data.Fixed.Deci Data.Fixed.Deci instance Data.Semimodule.LeftSemimodule Data.Fixed.Centi Data.Fixed.Centi instance Data.Semimodule.LeftSemimodule Data.Fixed.Milli Data.Fixed.Milli instance Data.Semimodule.LeftSemimodule Data.Fixed.Micro Data.Fixed.Micro instance Data.Semimodule.LeftSemimodule Data.Fixed.Nano Data.Fixed.Nano instance Data.Semimodule.LeftSemimodule Data.Fixed.Pico Data.Fixed.Pico instance Data.Semimodule.LeftSemimodule GHC.Types.Float GHC.Types.Float instance Data.Semimodule.LeftSemimodule GHC.Types.Double GHC.Types.Double instance Data.Semimodule.LeftSemimodule Foreign.C.Types.CFloat Foreign.C.Types.CFloat instance Data.Semimodule.LeftSemimodule Foreign.C.Types.CDouble Foreign.C.Types.CDouble instance Data.Semimodule.LeftSemimodule (GHC.Real.Ratio GHC.Integer.Type.Integer) (GHC.Real.Ratio GHC.Integer.Type.Integer) instance Data.Semimodule.LeftSemimodule (GHC.Real.Ratio GHC.Natural.Natural) (GHC.Real.Ratio GHC.Natural.Natural) module Data.Semimodule.Algebra -- | 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 algebra over a semiring. -- -- Note that the algebra needn't be associative. class Semiring a => Algebra a b -- |
-- joined = runTran diagonal . uncurry --joined :: Algebra a b => (b -> b -> a) -> b -> a -- |
-- rmap' (((c1,()),(c2,())) -> (c1,c2)) $ (id *** initial) . diagonal = id -- rmap' ((((),c1),((),c2)) -> (c1,c2)) $ (initial *** id) . diagonal = id --diagonal :: Algebra a b => Tran a b (b, b) -- | Obtain the diagonal of a tensor product as a vector. -- -- When the coalgebra 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 -- | 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 .*. -- | 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 = runTran initial . const --unital :: Unital a b => a -> b -> a initial :: Unital a b => Tran a b () -- | Insert an element into an algebra. -- --
-- >>> 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 one :: Complex Int -- 1 :+ 0 --unit' :: FreeUnital a f => f 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 . runTran codiagonal --cojoined :: Coalgebra a c => (c -> a) -> c -> c -> a -- |
-- lmap' ((c1,c2) -> ((c1,()),(c2,()))) $ (id *** coinitial) . codiagonal = id -- lmap' ((c1,c2) -> (((),c1),((),c2))) $ (coinitial *** id) . codiagonal = id --codiagonal :: Coalgebra a c => Tran a (c, c) c -- | 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 -- | Convolution with an associative algebra and coassociative coalgebra convolve :: Algebra a b => Coalgebra a c => Tran a b c -> Tran a b c -> Tran a b c -- | 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 coinitial :: Counital a c => Tran a () c -- | Obtain an element from a coalgebra over a free semimodule. counit :: FreeCounital a f => f 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 -- | 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 Tran a b c Tran :: ((c -> a) -> b -> a) -> Tran a b c [runTran] :: Tran 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 Endo a b = Tran a b b -- | Create a Tran 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)]) -> Tran a b c -- | Apply a transformation to a vector. (!#) :: Free f => Free g => Tran a (Rep f) (Rep g) -> g a -> f a infixr 2 !# -- | Apply a transformation to a vector. (#!) :: Free f => Free g => g a -> Tran a (Rep f) (Rep g) -> f a infixl 2 #! -- | Compose two transformations. (!#!) :: Tran a c d -> Tran a b c -> Tran a b d infix 2 !#! -- | Tran is a profunctor in the category of semimodules. -- -- Caution: Arbitrary mapping functions may violate linearity. -- --
-- >>> dimap' id (e3 True True False) (arr id) !# 4 :+ 5 :: V3 Int -- V3 5 5 4 --dimap' :: (b1 -> b2) -> (c1 -> c2) -> Tran a b2 c1 -> Tran a b1 c2 lmap' :: (b1 -> b2) -> Tran a b2 c -> Tran a b1 c rmap' :: (c1 -> c2) -> Tran a b c1 -> Tran a b c2 -- | Tran is an invariant functor. -- -- See also http://comonad.com/reader/2008/rotten-bananas/. invmap :: (a1 -> a2) -> (a2 -> a1) -> Tran a1 b c -> Tran a2 b c -- | Swap components of a tensor product. braid :: Tran a (b, c) (c, b) -- | Swap components of a direct sum. cobraid :: Tran a (b + c) (c + b) -- | TODO: Document split :: (b -> (b1, b2)) -> Tran a b1 c -> Tran a b2 c -> Tran a b c -- | TODO: Document cosplit :: ((c1 + c2) -> c) -> Tran a b c1 -> Tran a b c2 -> Tran 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 => Tran 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 => Tran 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 => Tran a (Rep f1) (Rep f2) -> Tran a (Rep g1) (Rep g2) -> (f2 ** g2) a -> (f1 ** g1) a instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Bialgebra a () instance (Data.Semimodule.Algebra.Bialgebra a b1, Data.Semimodule.Algebra.Bialgebra a b2) => Data.Semimodule.Algebra.Bialgebra a (b1, b2) instance (Data.Semimodule.Algebra.Bialgebra a b1, Data.Semimodule.Algebra.Bialgebra a b2, Data.Semimodule.Algebra.Bialgebra a b3) => Data.Semimodule.Algebra.Bialgebra a (b1, b2, b3) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Bialgebra a [b] instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Bialgebra a (Data.Sequence.Internal.Seq b) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Unital a () instance (Data.Semimodule.Algebra.Unital a b1, Data.Semimodule.Algebra.Unital a b2) => Data.Semimodule.Algebra.Unital a (b1, b2) instance (Data.Semimodule.Algebra.Unital a b1, Data.Semimodule.Algebra.Unital a b2, Data.Semimodule.Algebra.Unital a b3) => Data.Semimodule.Algebra.Unital a (b1, b2, b3) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Unital a [b] instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Unital a (Data.Sequence.Internal.Seq b) instance (Data.Semiring.Semiring a, GHC.Classes.Ord b) => Data.Semimodule.Algebra.Unital a (Data.Set.Internal.Set b) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Unital a Data.IntSet.Internal.IntSet instance Data.Semimodule.Algebra.Unital a b => Data.Semimodule.Algebra.Counital a (b -> a) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Algebra a () instance (Data.Semimodule.Algebra.Algebra a b1, Data.Semimodule.Algebra.Algebra a b2) => Data.Semimodule.Algebra.Algebra a (b1, b2) instance (Data.Semimodule.Algebra.Algebra a b1, Data.Semimodule.Algebra.Algebra a b2, Data.Semimodule.Algebra.Algebra a b3) => Data.Semimodule.Algebra.Algebra a (b1, b2, b3) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Algebra a [b] instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Algebra a (Data.Sequence.Internal.Seq b) instance (Data.Semiring.Semiring a, GHC.Classes.Ord b) => Data.Semimodule.Algebra.Algebra a (Data.Set.Internal.Set b) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Algebra a Data.IntSet.Internal.IntSet instance Data.Semimodule.Algebra.Algebra a b => Data.Semimodule.Algebra.Coalgebra a (b -> a) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Counital a () instance (Data.Semimodule.Algebra.Counital a c1, Data.Semimodule.Algebra.Counital a c2) => Data.Semimodule.Algebra.Counital a (c1, c2) instance (Data.Semimodule.Algebra.Counital a c1, Data.Semimodule.Algebra.Counital a c2, Data.Semimodule.Algebra.Counital a c3) => Data.Semimodule.Algebra.Counital a (c1, c2, c3) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Counital a [c] instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Counital a (Data.Sequence.Internal.Seq c) instance (Data.Semiring.Semiring a, GHC.Classes.Ord c) => Data.Semimodule.Algebra.Counital a (Data.Set.Internal.Set c) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Counital a Data.IntSet.Internal.IntSet instance Data.Semimodule.Algebra.Counital a c => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Algebra.Tran a b c)) instance Data.Semimodule.Algebra.Counital a c => Data.Semiring.Semiring (Data.Semimodule.Algebra.Tran a b c) instance Data.Semimodule.Algebra.Counital a m => Data.Semimodule.LeftSemimodule (Data.Semimodule.Algebra.Tran a b m) (Data.Semimodule.Algebra.Tran a b m) instance Data.Semimodule.Algebra.Counital a m => Data.Semimodule.RightSemimodule (Data.Semimodule.Algebra.Tran a b m) (Data.Semimodule.Algebra.Tran a b m) instance (Data.Semiring.Ring a, Data.Semimodule.Algebra.Counital a c) => Data.Semiring.Ring (Data.Semimodule.Algebra.Tran a b c) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Coalgebra a () instance (Data.Semimodule.Algebra.Coalgebra a c1, Data.Semimodule.Algebra.Coalgebra a c2) => Data.Semimodule.Algebra.Coalgebra a (c1, c2) instance (Data.Semimodule.Algebra.Coalgebra a c1, Data.Semimodule.Algebra.Coalgebra a c2, Data.Semimodule.Algebra.Coalgebra a c3) => Data.Semimodule.Algebra.Coalgebra a (c1, c2, c3) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Coalgebra a [c] instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Coalgebra a (Data.Sequence.Internal.Seq c) instance (Data.Semiring.Semiring a, GHC.Classes.Ord c) => Data.Semimodule.Algebra.Coalgebra a (Data.Set.Internal.Set c) instance Data.Semiring.Semiring a => Data.Semimodule.Algebra.Coalgebra a Data.IntSet.Internal.IntSet instance Data.Semimodule.Algebra.Coalgebra a c => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Algebra.Tran a b c)) instance Data.Semimodule.Algebra.Coalgebra a c => Data.Semiring.Presemiring (Data.Semimodule.Algebra.Tran a b c) instance GHC.Base.Functor (Data.Semimodule.Algebra.Tran a b) instance GHC.Base.Applicative (Data.Semimodule.Algebra.Tran a b) instance GHC.Base.Monad (Data.Semimodule.Algebra.Tran a b) instance Control.Category.Category (Data.Semimodule.Algebra.Tran a) instance Control.Arrow.Arrow (Data.Semimodule.Algebra.Tran a) instance Control.Arrow.ArrowChoice (Data.Semimodule.Algebra.Tran a) instance Control.Arrow.ArrowApply (Data.Semimodule.Algebra.Tran a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Control.Arrow.ArrowZero (Data.Semimodule.Algebra.Tran a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Control.Arrow.ArrowPlus (Data.Semimodule.Algebra.Tran a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Algebra.Tran a b c)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Algebra.Tran a b c)) instance Data.Semimodule.LeftSemimodule r s => Data.Semimodule.LeftSemimodule r (Data.Semimodule.Algebra.Tran s b m) instance Data.Semimodule.RightSemimodule r s => Data.Semimodule.RightSemimodule r (Data.Semimodule.Algebra.Tran s b m) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Algebra.Tran a b c)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Algebra.Tran a b c)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Algebra.Tran a b c)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Algebra.Tran a b c)) module Data.Semimodule.Dual -- | 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. newtype Dual a c Dual :: ((c -> a) -> a) -> Dual a c [runDual] :: Dual a c -> (c -> a) -> a infixr 3 `runDual` -- | Create a Dual from a linear combination of basis vectors. -- --
-- >>> image' [(2, E31),(3, E32)] !* V3 1 1 1 :: Int -- 5 --image' :: Semiring a => Foldable f => f (a, c) -> Dual a c -- | Apply a linear functional to a vector. (!*) :: Free f => Dual a (Rep f) -> f a -> a infixr 3 !* -- | Apply a linear functional to a vector. (*!) :: Free f => f a -> Dual a (Rep f) -> a infixl 3 *! -- | Obtain a linear transfrom from a linear functional. toTran :: (b -> Dual a c) -> Tran a b c -- | Obtain a linear functional from a linear transform. fromTran :: Tran a b c -> b -> Dual a c -- | TODO: Document init :: Unital a b => b -> Dual a () -- | TODO: Document coinit :: Counital a c => Dual a c -- | TODO: Document joined' :: Algebra a b => b -> Dual a (b, b) -- | TODO: Document -- --
-- cojoined' = curry $ fromTran codiagonal --cojoined' :: Coalgebra a c => c -> c -> Dual a c -- | TODO: Document convolve' :: Algebra a b => Coalgebra a c => (b -> Dual a c) -> (b -> Dual a c) -> b -> Dual a c instance GHC.Base.Functor (Data.Semimodule.Dual.Dual a) instance GHC.Base.Applicative (Data.Semimodule.Dual.Dual a) instance GHC.Base.Monad (Data.Semimodule.Dual.Dual a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Alternative (Data.Semimodule.Dual.Dual a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.MonadPlus (Data.Semimodule.Dual.Dual a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Dual.Dual a b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Dual.Dual a b)) instance Data.Semimodule.Algebra.Coalgebra a b => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Dual.Dual a b)) instance Data.Semimodule.Algebra.Counital a b => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Dual.Dual a b)) instance Data.Semimodule.Algebra.Coalgebra a b => Data.Semiring.Presemiring (Data.Semimodule.Dual.Dual a b) instance Data.Semimodule.Algebra.Counital a b => Data.Semiring.Semiring (Data.Semimodule.Dual.Dual a b) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Dual.Dual a b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Dual.Dual a b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Dual.Dual a b)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Dual.Dual a b)) instance (Data.Semiring.Ring a, Data.Semimodule.Algebra.Counital a b) => Data.Semiring.Ring (Data.Semimodule.Dual.Dual a b) instance Data.Semimodule.Algebra.Counital r m => Data.Semimodule.LeftSemimodule (Data.Semimodule.Dual.Dual r m) (Data.Semimodule.Dual.Dual r m) instance Data.Semimodule.LeftSemimodule r s => Data.Semimodule.LeftSemimodule r (Data.Semimodule.Dual.Dual s m) instance Data.Semimodule.Algebra.Counital r m => Data.Semimodule.RightSemimodule (Data.Semimodule.Dual.Dual r m) (Data.Semimodule.Dual.Dual r m) instance Data.Semimodule.RightSemimodule r s => Data.Semimodule.RightSemimodule r (Data.Semimodule.Dual.Dual s m) module Data.Semimodule.Operator type Free f = (Representable f) 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) -- | 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. newtype Dual a c Dual :: ((c -> a) -> a) -> Dual a c [runDual] :: Dual a c -> (c -> a) -> a infixr 3 `runDual` -- | Take the dual of a vector. -- --
-- >>> dual (V2 3 4) !% V2 1 2 :: Int -- 11 --dual :: FreeCounital a f => f a -> Dual a (Rep f) -- | Create a Dual from a linear combination of basis vectors. -- --
-- >>> image' [(2, E31),(3, E32)] !* V3 1 1 1 :: Int -- 5 --image' :: Semiring a => Foldable f => f (a, c) -> Dual a c -- | Dirac delta function. dirac :: Eq i => Semiring a => i -> i -> a -- | Create a unit vector at an index. -- --
-- >>> idx E21 :: V2 Int -- V2 1 0 ---- --
-- >>> idx E42 :: V4 Int -- V4 0 1 0 0 --idx :: Semiring a => Basis b f => b -> f a -- | Retrieve an element of a vector. -- --
-- >>> elt E21 (V2 1 2) -- 1 --elt :: Basis b f => b -> f a -> a -- | Create a lens from a representable functor. lensRep :: Basis b f => b -> forall g. Functor g => (a -> g a) -> f a -> g (f a) -- | Create an indexed grate from a representable functor. grateRep :: Basis b f => forall g. Functor g => (b -> g a1 -> a2) -> g (f a1) -> f a2 -- | Right-multiply a module element by a scalar. (.*) :: RightSemimodule r a => a -> r -> a infixl 7 .* -- | Apply a linear functional to a vector. (!*) :: Free f => Dual a (Rep f) -> f a -> a infixr 3 !* -- | Multiply a matrix on the right by a column vector. -- --
-- (.#) = (!#) . tran ---- --
-- >>> tran (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 .# -- | Apply a transformation to a vector. (!#) :: Free f => Free g => Tran a (Rep f) (Rep g) -> g a -> f a infixr 2 !# -- | Left-multiply a module element by a scalar. (*.) :: LeftSemimodule l a => l -> a -> a infixr 7 *. -- | Apply a linear functional to a vector. (*!) :: Free f => f a -> Dual a (Rep f) -> a infixl 3 *! -- | 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 -> Tran a (Rep f) (Rep g) -> f a infixl 2 #! -- | Inner product. -- -- 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 -- | 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 Tran a b c Tran :: ((c -> a) -> b -> a) -> Tran a b c [runTran] :: Tran a b c -> (c -> a) -> b -> a -- | Lift a matrix into a linear transformation -- --
-- (.#) = (!#) . tran --tran :: Free f => FreeCounital a g => (f ** g) a -> Tran a (Rep f) (Rep g) -- | Create a Tran 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)]) -> Tran a b c -- | Retrieve an element of a matrix. -- --
-- >>> elt2 E21 E21 $ m22 1 2 3 4 -- 1 --elt2 :: Basis2 b c f g => b -> c -> (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 the diagonal of a tensor product as a vector. -- -- When the coalgebra 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 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 .#. -- | Compose two transformations. (!#!) :: Tran a c d -> Tran a b c -> Tran a b d infix 2 !#! -- | 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 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.Algebra r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Unital r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Coalgebra r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Counital r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Bialgebra r Data.Semimodule.Basis.E4 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Algebra r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Unital r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Coalgebra r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Counital r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Bialgebra r Data.Semimodule.Basis.E3 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Algebra r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Unital r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Coalgebra r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Counital r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Bialgebra r Data.Semimodule.Basis.E2 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Algebra r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Unital r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Coalgebra r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Counital r Data.Semimodule.Basis.E1 instance Data.Semiring.Semiring r => Data.Semimodule.Algebra.Bialgebra r Data.Semimodule.Basis.E1 module Data.Semimodule.Free 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.Free.V4 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V4 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V4 a) instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V3 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V3 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V3 a) instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V2 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V2 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V2 a) instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V1 a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V1 a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V1 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M41 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M41 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M42 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M42 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M43 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M43 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M14 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M14 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M24 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M24 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M34 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M34 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M44 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M44 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M44 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M44 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M44 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a)) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M43 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a)) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M42 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M34 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M31 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M31 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M32 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M32 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M13 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M13 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M23 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M23 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M33 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M33 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M33 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M33 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M33 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a)) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M32 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M24 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M23 a) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M21 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M21 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M12 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M12 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M22 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M22 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M22 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M22 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M22 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a)) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M41 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a)) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M31 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a)) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M21 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M14 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M13 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M12 a) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a) instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M11 a)) instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Additive.Multiplicative (Data.Semimodule.Free.M11 a)) instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M11 a) instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M11 a) instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M11 a) instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V4 instance GHC.Base.Functor Data.Semimodule.Free.V4 instance GHC.Base.Applicative Data.Semimodule.Free.V4 instance Data.Foldable.Foldable Data.Semimodule.Free.V4 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V4 instance Data.Distributive.Distributive Data.Semimodule.Free.V4 instance Data.Functor.Rep.Representable Data.Semimodule.Free.V4 instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V4 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V4 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V4 a) instance Data.Functor.Classes.Eq1 Data.Semimodule.Free.V3 instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V3 instance GHC.Base.Functor Data.Semimodule.Free.V3 instance GHC.Base.Applicative Data.Semimodule.Free.V3 instance Data.Foldable.Foldable Data.Semimodule.Free.V3 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V3 instance Data.Distributive.Distributive Data.Semimodule.Free.V3 instance Data.Functor.Rep.Representable Data.Semimodule.Free.V3 instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V3 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V3 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V3 a) instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V2 instance GHC.Base.Functor Data.Semimodule.Free.V2 instance GHC.Base.Applicative Data.Semimodule.Free.V2 instance Data.Foldable.Foldable Data.Semimodule.Free.V2 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V2 instance Data.Distributive.Distributive Data.Semimodule.Free.V2 instance Data.Functor.Rep.Representable Data.Semimodule.Free.V2 instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V2 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V2 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V2 a) instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V1 instance GHC.Base.Functor Data.Semimodule.Free.V1 instance GHC.Base.Applicative Data.Semimodule.Free.V1 instance Data.Foldable.Foldable Data.Semimodule.Free.V1 instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V1 instance Data.Distributive.Distributive Data.Semimodule.Free.V1 instance Data.Functor.Rep.Representable Data.Semimodule.Free.V1 instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a)) instance (Data.Semigroup.Additive.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a)) instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V1 a) instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V1 a) instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.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 -- | <math> -- -- Presemiring morphisms must be compatible with right-distribution. morphism_distribitive_on :: Presemiring r => Presemiring s => Rel s b -> (r -> s) -> r -> r -> r -> b -- | Semiring morphisms are monoidal presemiring morphisms. -- -- This is a required property for semiring morphisms. morphism_semiring :: Eq s => Semiring r => Semiring s => (r -> s) -> r -> r -> r -> Bool -- | <math> -- -- A semigroup with a right-neutral additive identity must satisfy: -- --
-- neutral_addition_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 -- | <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