packages feed

rings 0.0.3 → 0.0.3.1

raw patch · 16 files changed

+2193/−2309 lines, 16 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.Algebra: (.@.) :: Representable f => Composition a (Rep f) => Semigroup (f a) => Field a => f a -> f a -> a
- Data.Algebra: (//) :: Representable f => Division r (Rep f) => f r -> f r -> f r
- Data.Algebra: (><) :: (Representable f, Algebra r (Rep f)) => f r -> f r -> f r
- Data.Algebra: class Semiring r => Algebra r a
- Data.Algebra: class Algebra r a => Composition r a
- Data.Algebra: class (Semifield r, Unital r a) => Division r a
- Data.Algebra: class (Semiring r, Algebra r a) => Unital r a
- Data.Algebra: conj :: Representable f => Composition r (Rep f) => f r -> f r
- Data.Algebra: conjugateWith :: Composition r a => (a -> r) -> a -> r
- Data.Algebra: infix 6 .@.
- Data.Algebra: infixl 7 //
- Data.Algebra: instance (Data.Algebra.Algebra r a, Data.Algebra.Algebra r b) => Data.Algebra.Algebra r (a, b)
- Data.Algebra: instance (Data.Algebra.Algebra r a, Data.Algebra.Algebra r b, Data.Algebra.Algebra r c) => Data.Algebra.Algebra r (a, b, c)
- Data.Algebra: instance (Data.Algebra.Unital r a, Data.Algebra.Unital r b) => Data.Algebra.Unital r (a, b)
- Data.Algebra: instance (Data.Algebra.Unital r a, Data.Algebra.Unital r b, Data.Algebra.Unital r c) => Data.Algebra.Unital r (a, b, c)
- Data.Algebra: instance Data.Semifield.Field r => Data.Algebra.Division r Data.Algebra.ComplexBasis
- Data.Algebra: instance Data.Semiring.Ring r => Data.Algebra.Algebra r Data.Algebra.ComplexBasis
- Data.Algebra: instance Data.Semiring.Ring r => Data.Algebra.Composition r Data.Algebra.ComplexBasis
- Data.Algebra: instance Data.Semiring.Ring r => Data.Algebra.Unital r Data.Algebra.ComplexBasis
- Data.Algebra: instance Data.Semiring.Semiring r => Data.Algebra.Algebra r ()
- Data.Algebra: instance Data.Semiring.Semiring r => Data.Algebra.Algebra r [a]
- Data.Algebra: instance Data.Semiring.Semiring r => Data.Algebra.Unital r ()
- Data.Algebra: instance Data.Semiring.Semiring r => Data.Algebra.Unital r [a]
- Data.Algebra: multiplyWith :: Algebra r a => (a -> a -> r) -> a -> r
- Data.Algebra: norm :: (Representable f, Composition r (Rep f)) => f r -> r
- Data.Algebra: normWith :: Composition r a => (a -> r) -> r
- Data.Algebra: reciprocal :: Representable f => Division a (Rep f) => f a -> f a
- Data.Algebra: reciprocalWith :: Division r a => (a -> r) -> a -> r
- Data.Algebra: triple :: Free f => Foldable f => Algebra a (Rep f) => f a -> f a -> f a -> a
- Data.Algebra: unit :: Representable f => Unital r (Rep f) => f r
- Data.Algebra: unitWith :: Unital r a => r -> a -> r
- Data.Algebra.Quaternion: Quaternion :: !a -> {-# UNPACK #-} !V3 a -> Quaternion a
- Data.Algebra.Quaternion: data Quaternion a
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance Data.Distributive.Distributive Data.Algebra.Quaternion.Quaternion
- Data.Algebra.Quaternion: instance Data.Foldable.Foldable Data.Algebra.Quaternion.Quaternion
- Data.Algebra.Quaternion: instance Data.Functor.Rep.Representable Data.Algebra.Quaternion.Quaternion
- Data.Algebra.Quaternion: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Algebra.Quaternion.Quaternion
- Data.Algebra.Quaternion: instance Data.Semiring.Ring a => Data.Semiring.Presemiring (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance Data.Semiring.Ring a => Data.Semiring.Semiring (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance Data.Semiring.Ring a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance Data.Semiring.Ring a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Algebra.Quaternion.Quaternion a))
- Data.Algebra.Quaternion: instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance GHC.Base.Functor Data.Algebra.Quaternion.Quaternion
- Data.Algebra.Quaternion: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance GHC.Generics.Generic (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: instance GHC.Generics.Generic1 Data.Algebra.Quaternion.Quaternion
- Data.Algebra.Quaternion: instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Quaternion.Quaternion a)
- Data.Algebra.Quaternion: normalize :: QuatD -> QuatD
- Data.Algebra.Quaternion: qe :: Semiring a => Quaternion a
- Data.Algebra.Quaternion: qi :: Semiring a => Quaternion a
- Data.Algebra.Quaternion: qj :: Semiring a => Quaternion a
- Data.Algebra.Quaternion: qk :: Semiring a => Quaternion a
- Data.Algebra.Quaternion: quat :: a -> a -> a -> a -> Quaternion a
- Data.Algebra.Quaternion: rotate :: Ring a => Quaternion a -> V3 a -> V3 a
- Data.Algebra.Quaternion: scal :: Quaternion a -> a
- Data.Algebra.Quaternion: type QuatD = Quaternion Double
- Data.Algebra.Quaternion: type QuatF = Quaternion Float
- Data.Algebra.Quaternion: type QuatM = Quaternion Micro
- Data.Algebra.Quaternion: type QuatN = Quaternion Nano
- Data.Algebra.Quaternion: type QuatP = Quaternion Pico
- Data.Algebra.Quaternion: type QuatR = Quaternion Rational
- Data.Algebra.Quaternion: vect :: Quaternion a -> V3 a
- Data.Semigroup.Multiplicative: div :: (Multiplicative - Group) a => a -> a -> a
- Data.Semimodule: (.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a
- Data.Semimodule: class (Semiring r, Semigroup a) => Semimodule r a
- Data.Semimodule: dirac :: Eq i => Semiring a => i -> i -> a
- Data.Semimodule: idx :: Free f => Semiring a => Rep f -> f a
- Data.Semimodule: infix 6 .*.
- Data.Semimodule: instance (Data.Semimodule.Semimodule r a, Data.Semimodule.Semimodule r b) => Data.Semimodule.Semimodule r (a, b)
- Data.Semimodule: instance (Data.Semimodule.Semimodule r a, Data.Semimodule.Semimodule r b, Data.Semimodule.Semimodule r c) => Data.Semimodule.Semimodule r (a, b, c)
- Data.Semimodule: instance (Data.Semiring.Ring a, Data.Semimodule.Semimodule r a) => Data.Semimodule.Semimodule r (Data.Semigroup.Additive.Additive (Data.Complex.Complex a))
- Data.Semimodule: instance (Data.Semiring.Semiring a, Data.Semimodule.Semimodule r a) => Data.Semimodule.Semimodule r (Data.Semigroup.Additive.Additive (GHC.Real.Ratio a))
- Data.Semimodule: instance Data.Group.Group a => Data.Semimodule.Semimodule GHC.Integer.Type.Integer a
- Data.Semimodule: instance Data.Semimodule.Semimodule r a => Data.Semimodule.Semimodule r (e -> a)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Centi => Data.Semimodule.Semimodule Data.Fixed.Centi (Data.Semigroup.Additive.Additive Data.Fixed.Centi)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Deci => Data.Semimodule.Semimodule Data.Fixed.Deci (Data.Semigroup.Additive.Additive Data.Fixed.Deci)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Micro => Data.Semimodule.Semimodule Data.Fixed.Micro (Data.Semigroup.Additive.Additive Data.Fixed.Micro)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Milli => Data.Semimodule.Semimodule Data.Fixed.Milli (Data.Semigroup.Additive.Additive Data.Fixed.Milli)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Nano => Data.Semimodule.Semimodule Data.Fixed.Nano (Data.Semigroup.Additive.Additive Data.Fixed.Nano)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Pico => Data.Semimodule.Semimodule Data.Fixed.Pico (Data.Semigroup.Additive.Additive Data.Fixed.Pico)
- Data.Semimodule: instance Data.Semiring.Semiring Data.Fixed.Uni => Data.Semimodule.Semimodule Data.Fixed.Uni (Data.Semigroup.Additive.Additive Data.Fixed.Uni)
- Data.Semimodule: instance Data.Semiring.Semiring Foreign.C.Types.CDouble => Data.Semimodule.Semimodule Foreign.C.Types.CDouble (Data.Semigroup.Additive.Additive Foreign.C.Types.CDouble)
- Data.Semimodule: instance Data.Semiring.Semiring Foreign.C.Types.CFloat => Data.Semimodule.Semimodule Foreign.C.Types.CFloat (Data.Semigroup.Additive.Additive Foreign.C.Types.CFloat)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Int.Int16 => Data.Semimodule.Semimodule GHC.Int.Int16 (Data.Semigroup.Additive.Additive GHC.Int.Int16)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Int.Int32 => Data.Semimodule.Semimodule GHC.Int.Int32 (Data.Semigroup.Additive.Additive GHC.Int.Int32)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Int.Int64 => Data.Semimodule.Semimodule GHC.Int.Int64 (Data.Semigroup.Additive.Additive GHC.Int.Int64)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Int.Int8 => Data.Semimodule.Semimodule GHC.Int.Int8 (Data.Semigroup.Additive.Additive GHC.Int.Int8)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Types.Bool => Data.Semimodule.Semimodule GHC.Types.Bool (Data.Semigroup.Additive.Additive GHC.Types.Bool)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Types.Double => Data.Semimodule.Semimodule GHC.Types.Double (Data.Semigroup.Additive.Additive GHC.Types.Double)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Types.Float => Data.Semimodule.Semimodule GHC.Types.Float (Data.Semigroup.Additive.Additive GHC.Types.Float)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Types.Int => Data.Semimodule.Semimodule GHC.Types.Int (Data.Semigroup.Additive.Additive GHC.Types.Int)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Types.Word => Data.Semimodule.Semimodule GHC.Types.Word (Data.Semigroup.Additive.Additive GHC.Types.Word)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Word.Word16 => Data.Semimodule.Semimodule GHC.Word.Word16 (Data.Semigroup.Additive.Additive GHC.Word.Word16)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Word.Word32 => Data.Semimodule.Semimodule GHC.Word.Word32 (Data.Semigroup.Additive.Additive GHC.Word.Word32)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Word.Word64 => Data.Semimodule.Semimodule GHC.Word.Word64 (Data.Semigroup.Additive.Additive GHC.Word.Word64)
- Data.Semimodule: instance Data.Semiring.Semiring GHC.Word.Word8 => Data.Semimodule.Semimodule GHC.Word.Word8 (Data.Semigroup.Additive.Additive GHC.Word.Word8)
- Data.Semimodule: instance Data.Semiring.Semiring r => Data.Semimodule.Semimodule r ()
- Data.Semimodule: instance GHC.Base.Monoid a => Data.Semimodule.Semimodule GHC.Natural.Natural a
- Data.Semimodule: instance GHC.Base.Semigroup a => Data.Semimodule.Semimodule () a
- Data.Semimodule: multl :: Semiring a => Functor f => a -> f a -> f a
- Data.Semimodule: multr :: Semiring a => Functor f => f a -> a -> f a
- Data.Semimodule: qd :: Free f => Foldable f => Module a (f a) => f a -> f a -> a
- Data.Semimodule: quadrance :: Free f => Foldable f => Semiring a => f a -> a
- Data.Semimodule: type Module r a = (Ring r, Group a, Semimodule r a)
- Data.Semimodule.Matrix: (#.) :: (Semiring a, Free f, Foldable f, Free g) => f a -> f (g a) -> g a
- Data.Semimodule.Matrix: (*.) :: Semimodule r a => r -> a -> a
- Data.Semimodule.Matrix: (.#) :: (Semiring a, Free f, Free g, Foldable g) => f (g a) -> g a -> f a
- Data.Semimodule.Matrix: (.#.) :: (Semiring a, Free f, Free g, Free h, Foldable g) => f (g a) -> g (h a) -> f (h a)
- Data.Semimodule.Matrix: (.*) :: Semimodule r a => a -> r -> a
- Data.Semimodule.Matrix: (.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a
- Data.Semimodule.Matrix: bdet2 :: Semiring a => Basis I2 f => Basis I2 g => f (g a) -> (a, a)
- Data.Semimodule.Matrix: bdet3 :: Semiring a => Basis I3 f => Basis I3 g => f (g a) -> (a, a)
- Data.Semimodule.Matrix: bdet4 :: Semiring a => Basis I4 f => Basis I4 g => f (g a) -> (a, a)
- Data.Semimodule.Matrix: col :: Functor f => Representable g => Rep g -> f (g a) -> f a
- Data.Semimodule.Matrix: cols :: Free f => Free g => f a -> f (g a)
- Data.Semimodule.Matrix: det2 :: Ring a => Basis I2 f => Basis I2 g => f (g a) -> a
- Data.Semimodule.Matrix: det3 :: Ring a => Basis I3 f => Basis I3 g => f (g a) -> a
- Data.Semimodule.Matrix: det4 :: Ring a => Basis I4 f => Basis I4 g => f (g a) -> a
- Data.Semimodule.Matrix: diagonal :: Representable f => f (f a) -> f a
- Data.Semimodule.Matrix: dirac :: Eq i => Semiring a => i -> i -> a
- Data.Semimodule.Matrix: grateRep :: Representable f => forall g. Functor g => (Rep f -> g a -> b) -> g (f a) -> f b
- Data.Semimodule.Matrix: identity :: Semiring a => Free f => f (f a)
- Data.Semimodule.Matrix: infix 6 .*.
- Data.Semimodule.Matrix: infixl 7 *.
- Data.Semimodule.Matrix: infixr 7 .#.
- Data.Semimodule.Matrix: inv2 :: Field a => Basis I2 f => Basis I2 g => f (g a) -> g (f a)
- Data.Semimodule.Matrix: inv3 :: forall a f g. Field a => Basis I3 f => Basis I3 g => f (g a) -> g (f a)
- Data.Semimodule.Matrix: inv4 :: forall a f g. Field a => Basis I4 f => Basis I4 g => f (g a) -> g (f a)
- Data.Semimodule.Matrix: lensRep :: Eq (Rep f) => Representable f => Rep f -> forall g. Functor g => (a -> g a) -> f a -> g (f a)
- Data.Semimodule.Matrix: m22 :: Basis I2 f => Basis I2 g => a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m23 :: Basis I2 f => Basis I3 g => a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m24 :: Basis I2 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m32 :: Basis I3 f => Basis I2 g => a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m33 :: Basis I3 f => Basis I3 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m34 :: Basis I3 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m42 :: Basis I4 f => Basis I2 g => a -> a -> a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m43 :: Basis I4 f => Basis I3 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: m44 :: Basis I4 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)
- Data.Semimodule.Matrix: outer :: Semiring a => Functor f => Functor g => f a -> g a -> f (g a)
- Data.Semimodule.Matrix: row :: Representable f => Rep f -> f a -> a
- Data.Semimodule.Matrix: rows :: Free f => Free g => g a -> f (g a)
- Data.Semimodule.Matrix: scale :: (Additive - Monoid) a => Free f => f a -> f (f a)
- Data.Semimodule.Matrix: trace :: Semiring a => Free f => Foldable f => f (f a) -> a
- Data.Semimodule.Matrix: tran :: Semiring a => Basis b f => Basis c g => Foldable g => f (g a) -> Tran a b c
- Data.Semimodule.Matrix: transpose :: Free f => Free g => f (g a) -> g (f a)
- Data.Semimodule.Matrix: type M22 a = V2 (V2 a)
- Data.Semimodule.Matrix: type M23 a = V2 (V3 a)
- Data.Semimodule.Matrix: type M24 a = V2 (V4 a)
- Data.Semimodule.Matrix: type M32 a = V3 (V2 a)
- Data.Semimodule.Matrix: type M33 a = V3 (V3 a)
- Data.Semimodule.Matrix: type M34 a = V3 (V4 a)
- Data.Semimodule.Matrix: type M42 a = V4 (V2 a)
- Data.Semimodule.Matrix: type M43 a = V4 (V3 a)
- Data.Semimodule.Matrix: type M44 a = V4 (V4 a)
- Data.Semimodule.Transform: adivided :: Index a1 b -> Index a2 b -> Index (a1, a2) b
- Data.Semimodule.Transform: aselected :: Index a b1 -> Index a b2 -> Index a (b1 + b2)
- Data.Semimodule.Transform: ebraid :: Index (a + b) (b + a)
- Data.Semimodule.Transform: exl :: Index a (a + b)
- Data.Semimodule.Transform: exr :: Index b (a + b)
- Data.Semimodule.Transform: in1 :: Index (a, b) b
- Data.Semimodule.Transform: in2 :: Index (a, b) a
- Data.Semimodule.Transform: type Index b c = forall a. Tran a b c
- Data.Semimodule.Vector: (*.) :: Semimodule r a => r -> a -> a
- Data.Semimodule.Vector: (.*) :: Semimodule r a => a -> r -> a
- Data.Semimodule.Vector: (.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a
- Data.Semimodule.Vector: (><) :: (Representable f, Algebra r (Rep f)) => f r -> f r -> f r
- Data.Semimodule.Vector: I21 :: I2
- Data.Semimodule.Vector: I22 :: I2
- Data.Semimodule.Vector: I31 :: I3
- Data.Semimodule.Vector: I32 :: I3
- Data.Semimodule.Vector: I33 :: I3
- Data.Semimodule.Vector: I41 :: I4
- Data.Semimodule.Vector: I42 :: I4
- Data.Semimodule.Vector: I43 :: I4
- Data.Semimodule.Vector: I44 :: I4
- Data.Semimodule.Vector: V2 :: !a -> !a -> V2 a
- Data.Semimodule.Vector: V3 :: !a -> !a -> !a -> V3 a
- Data.Semimodule.Vector: V4 :: !a -> !a -> !a -> !a -> V4 a
- Data.Semimodule.Vector: data I2
- Data.Semimodule.Vector: data I3
- Data.Semimodule.Vector: data I4
- Data.Semimodule.Vector: data V2 a
- Data.Semimodule.Vector: data V3 a
- Data.Semimodule.Vector: data V4 a
- Data.Semimodule.Vector: dirac :: Eq i => Semiring a => i -> i -> a
- Data.Semimodule.Vector: fillI2 :: Basis I2 f => a -> a -> f a
- Data.Semimodule.Vector: fillI3 :: Basis I3 f => a -> a -> a -> f a
- Data.Semimodule.Vector: fillI4 :: Basis I4 f => a -> a -> a -> a -> f a
- Data.Semimodule.Vector: i2 :: a -> a -> I2 -> a
- Data.Semimodule.Vector: i3 :: a -> a -> a -> I3 -> a
- Data.Semimodule.Vector: i4 :: a -> a -> a -> a -> I4 -> a
- Data.Semimodule.Vector: infix 6 .*.
- Data.Semimodule.Vector: infixl 7 ><
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V2 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V3 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Vector.V4 a))
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance Data.Distributive.Distributive Data.Semimodule.Vector.V2
- Data.Semimodule.Vector: instance Data.Distributive.Distributive Data.Semimodule.Vector.V3
- Data.Semimodule.Vector: instance Data.Distributive.Distributive Data.Semimodule.Vector.V4
- Data.Semimodule.Vector: instance Data.Foldable.Foldable Data.Semimodule.Vector.V2
- Data.Semimodule.Vector: instance Data.Foldable.Foldable Data.Semimodule.Vector.V3
- Data.Semimodule.Vector: instance Data.Foldable.Foldable Data.Semimodule.Vector.V4
- Data.Semimodule.Vector: instance Data.Functor.Rep.Representable Data.Semimodule.Vector.V2
- Data.Semimodule.Vector: instance Data.Functor.Rep.Representable Data.Semimodule.Vector.V3
- Data.Semimodule.Vector: instance Data.Functor.Rep.Representable Data.Semimodule.Vector.V4
- Data.Semimodule.Vector: instance Data.Semifield.Field r => Data.Algebra.Division r Data.Semimodule.Vector.QuaternionBasis
- Data.Semimodule.Vector: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Vector.V2
- Data.Semimodule.Vector: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Vector.V3
- Data.Semimodule.Vector: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Vector.V4
- Data.Semimodule.Vector: instance Data.Semiring.Ring r => Data.Algebra.Algebra r Data.Semimodule.Vector.I3
- Data.Semimodule.Vector: instance Data.Semiring.Ring r => Data.Algebra.Algebra r Data.Semimodule.Vector.QuaternionBasis
- Data.Semimodule.Vector: instance Data.Semiring.Ring r => Data.Algebra.Composition r Data.Semimodule.Vector.I3
- Data.Semimodule.Vector: instance Data.Semiring.Ring r => Data.Algebra.Composition r Data.Semimodule.Vector.QuaternionBasis
- Data.Semimodule.Vector: instance Data.Semiring.Ring r => Data.Algebra.Unital r Data.Semimodule.Vector.QuaternionBasis
- Data.Semimodule.Vector: instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance Data.Semiring.Semiring a => Data.Semimodule.Semimodule a (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance Data.Semiring.Semiring r => Data.Algebra.Algebra r Data.Semimodule.Vector.I2
- Data.Semimodule.Vector: instance Data.Semiring.Semiring r => Data.Algebra.Composition r Data.Semimodule.Vector.I2
- Data.Semimodule.Vector: instance GHC.Base.Applicative Data.Semimodule.Vector.V2
- Data.Semimodule.Vector: instance GHC.Base.Applicative Data.Semimodule.Vector.V3
- Data.Semimodule.Vector: instance GHC.Base.Applicative Data.Semimodule.Vector.V4
- Data.Semimodule.Vector: instance GHC.Base.Functor Data.Semimodule.Vector.V2
- Data.Semimodule.Vector: instance GHC.Base.Functor Data.Semimodule.Vector.V3
- Data.Semimodule.Vector: instance GHC.Base.Functor Data.Semimodule.Vector.V4
- Data.Semimodule.Vector: instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I2)
- Data.Semimodule.Vector: instance GHC.Base.Monoid (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I3)
- Data.Semimodule.Vector: instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I2)
- Data.Semimodule.Vector: instance GHC.Base.Semigroup (Data.Semigroup.Additive.Additive Data.Semimodule.Vector.I3)
- Data.Semimodule.Vector: instance GHC.Classes.Eq Data.Semimodule.Vector.I2
- Data.Semimodule.Vector: instance GHC.Classes.Eq Data.Semimodule.Vector.I3
- Data.Semimodule.Vector: instance GHC.Classes.Eq Data.Semimodule.Vector.I4
- Data.Semimodule.Vector: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance GHC.Classes.Ord Data.Semimodule.Vector.I2
- Data.Semimodule.Vector: instance GHC.Classes.Ord Data.Semimodule.Vector.I3
- Data.Semimodule.Vector: instance GHC.Classes.Ord Data.Semimodule.Vector.I4
- Data.Semimodule.Vector: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: instance GHC.Show.Show Data.Semimodule.Vector.I2
- Data.Semimodule.Vector: instance GHC.Show.Show Data.Semimodule.Vector.I3
- Data.Semimodule.Vector: instance GHC.Show.Show Data.Semimodule.Vector.I4
- Data.Semimodule.Vector: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Vector.V2 a)
- Data.Semimodule.Vector: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Vector.V3 a)
- Data.Semimodule.Vector: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Vector.V4 a)
- Data.Semimodule.Vector: lerp :: Module r a => r -> a -> a -> a
- Data.Semimodule.Vector: qd :: Free f => Foldable f => Module a (f a) => f a -> f a -> a
- Data.Semimodule.Vector: quadrance :: Free f => Foldable f => Semiring a => f a -> a
- Data.Semimodule.Vector: triple :: Free f => Foldable f => Algebra a (Rep f) => f a -> f a -> f a -> a
- Data.Semimodule.Vector: type Basis b f = (Free f, Rep f ~ b)
- Data.Semimodule.Vector: type QuaternionBasis = Maybe I3
- Data.Semiring: (//) :: Quasigroup a => a -> a -> a
- Data.Semiring: (\\) :: Quasigroup a => a -> a -> a
- Data.Semiring: cross :: Foldable f => Applicative f => Presemiring a => (Additive - Monoid) a => f a -> f a -> a
- Data.Semiring: cross1 :: Foldable1 f => Apply f => Presemiring a => f a -> f a -> a
- Data.Semiring: lempty :: Loop a => a
- Data.Semiring: lreplicate :: Loop a => Natural -> a -> a
- Data.Semiring.Property: distributive_cross1_on :: Presemiring r => Apply f => Foldable1 f => Rel r b -> f r -> f r -> b
- Data.Semiring.Property: distributive_cross_on :: Semiring r => Applicative f => Foldable f => Rel r b -> f r -> f r -> b
+ Data.Semifield: (\\) :: (Multiplicative - Group) a => a -> a -> a
+ Data.Semifield: class Field a => Real a
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Centi
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Deci
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Micro
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Milli
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Nano
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Pico
+ Data.Semifield: instance Data.Semifield.Real Data.Fixed.Uni
+ Data.Semifield: instance Data.Semifield.Real Foreign.C.Types.CDouble
+ Data.Semifield: instance Data.Semifield.Real Foreign.C.Types.CFloat
+ Data.Semifield: instance Data.Semifield.Real GHC.Real.Rational
+ Data.Semifield: instance Data.Semifield.Real GHC.Types.Double
+ Data.Semifield: instance Data.Semifield.Real GHC.Types.Float
+ Data.Semigroup.Additive: abs :: (Additive - Group) a => Ord a => a -> a
+ Data.Semigroup.Additive: instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid b) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (a, b))
+ Data.Semigroup.Additive: instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid b, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid c) => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (a, b, c))
+ Data.Semigroup.Additive: instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup b, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup c) => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (a, b, c))
+ Data.Semigroup.Additive: negate :: (Additive - Group) a => a -> a
+ Data.Semigroup.Multiplicative: (\\) :: (Multiplicative - Group) a => a -> a -> a
+ Data.Semigroup.Multiplicative: (^^) :: (Multiplicative - Group) a => a -> Integer -> a
+ Data.Semigroup.Multiplicative: infixr 8 ^^
+ Data.Semigroup.Multiplicative: recip :: (Multiplicative - Group) a => a -> a
+ Data.Semigroup.Property: associative_addition_on :: (Additive - Semigroup) r => Rel r b -> r -> r -> r -> b
+ Data.Semigroup.Property: associative_multiplication_on :: (Multiplicative - Semigroup) r => Rel r b -> r -> r -> r -> b
+ Data.Semigroup.Property: cancellative_addition_on :: (Additive - Semigroup) r => Rel r Bool -> r -> r -> r -> Bool
+ Data.Semigroup.Property: cancellative_multiplication_on :: (Multiplicative - Semigroup) r => Rel r Bool -> r -> r -> r -> Bool
+ Data.Semigroup.Property: commutative_addition_on :: (Additive - Semigroup) r => Rel r b -> r -> r -> b
+ Data.Semigroup.Property: commutative_multiplication_on :: (Multiplicative - Semigroup) r => Rel r b -> r -> r -> b
+ Data.Semigroup.Property: idempotent_addition_on :: (Additive - Semigroup) r => Rel r b -> r -> b
+ Data.Semigroup.Property: idempotent_multiplication_on :: (Multiplicative - Semigroup) r => Rel r b -> r -> b
+ Data.Semigroup.Property: morphism_additive_on :: (Additive - Semigroup) r => (Additive - Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b
+ Data.Semigroup.Property: morphism_additive_on' :: (Additive - Monoid) r => (Additive - Monoid) s => Rel s b -> (r -> s) -> b
+ Data.Semigroup.Property: morphism_multiplicative_on :: (Multiplicative - Semigroup) r => (Multiplicative - Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b
+ Data.Semigroup.Property: morphism_multiplicative_on' :: (Multiplicative - Monoid) r => (Multiplicative - Monoid) s => Rel s b -> (r -> s) -> b
+ Data.Semigroup.Property: neutral_addition_on :: (Additive - Monoid) r => Rel r b -> r -> b
+ Data.Semigroup.Property: neutral_multiplication_on :: (Multiplicative - Monoid) r => Rel r b -> r -> b
+ Data.Semimodule: (./) :: Semifield a => Functor f => f a -> a -> f a
+ Data.Semimodule: (.\) :: Semifield a => Functor f => f a -> a -> f a
+ Data.Semimodule: (/.) :: Semifield a => Functor f => a -> f a -> f a
+ Data.Semimodule: (\.) :: Semifield a => Functor f => a -> f a -> f a
+ Data.Semimodule: class (LeftSemimodule l a, RightSemimodule r a) => Bisemimodule l r a
+ Data.Semimodule: class (Semiring l, (Additive - Monoid) a) => LeftSemimodule l a
+ Data.Semimodule: class (Semiring r, (Additive - Monoid) a) => RightSemimodule r a
+ Data.Semimodule: discale :: Bisemimodule l r a => l -> r -> a -> a
+ Data.Semimodule: infixr 7 \.
+ Data.Semimodule: instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a) => Data.Semimodule.LeftSemimodule GHC.Integer.Type.Integer a
+ Data.Semimodule: instance ((Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a, (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a) => Data.Semimodule.RightSemimodule GHC.Integer.Type.Integer a
+ Data.Semimodule: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.LeftSemimodule () a
+ Data.Semimodule: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.LeftSemimodule GHC.Natural.Natural a
+ Data.Semimodule: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.RightSemimodule () a
+ Data.Semimodule: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => Data.Semimodule.RightSemimodule GHC.Natural.Natural a
+ Data.Semimodule: instance (Data.Semimodule.Bisemimodule r r a, Data.Semimodule.Bisemimodule r r b) => Data.Semimodule.Bisemimodule r r (a, b)
+ Data.Semimodule: 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)
+ Data.Semimodule: instance (Data.Semimodule.LeftSemimodule l a, Data.Semimodule.LeftSemimodule l b) => Data.Semimodule.LeftSemimodule l (a, b)
+ Data.Semimodule: instance (Data.Semimodule.LeftSemimodule l a, Data.Semimodule.LeftSemimodule l b, Data.Semimodule.LeftSemimodule l c) => Data.Semimodule.LeftSemimodule l (a, b, c)
+ Data.Semimodule: instance (Data.Semimodule.RightSemimodule r a, Data.Semimodule.RightSemimodule r b) => Data.Semimodule.RightSemimodule r (a, b)
+ Data.Semimodule: instance (Data.Semimodule.RightSemimodule r a, Data.Semimodule.RightSemimodule r b, Data.Semimodule.RightSemimodule r c) => Data.Semimodule.RightSemimodule r (a, b, c)
+ Data.Semimodule: instance Data.Semimodule.Bisemimodule r r a => Data.Semimodule.Bisemimodule r r (e -> a)
+ Data.Semimodule: instance Data.Semimodule.LeftSemimodule l a => Data.Semimodule.LeftSemimodule l (e -> a)
+ Data.Semimodule: instance Data.Semimodule.RightSemimodule r a => Data.Semimodule.RightSemimodule r (e -> a)
+ Data.Semimodule: instance Data.Semiring.Ring a => Data.Semimodule.Bisemimodule (Data.Complex.Complex a) (Data.Complex.Complex a) (Data.Complex.Complex a)
+ Data.Semimodule: instance Data.Semiring.Ring a => Data.Semimodule.Bisemimodule a a (Data.Complex.Complex a)
+ Data.Semimodule: instance Data.Semiring.Ring a => Data.Semimodule.LeftSemimodule (Data.Complex.Complex a) (Data.Complex.Complex a)
+ Data.Semimodule: instance Data.Semiring.Ring a => Data.Semimodule.LeftSemimodule a (Data.Complex.Complex a)
+ Data.Semimodule: instance Data.Semiring.Ring a => Data.Semimodule.RightSemimodule (Data.Complex.Complex a) (Data.Complex.Complex a)
+ Data.Semimodule: instance Data.Semiring.Ring a => Data.Semimodule.RightSemimodule a (Data.Complex.Complex a)
+ Data.Semimodule: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (GHC.Real.Ratio a)
+ Data.Semimodule: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (GHC.Real.Ratio a)
+ Data.Semimodule: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (GHC.Real.Ratio a)
+ Data.Semimodule: instance Data.Semiring.Semiring l => Data.Semimodule.LeftSemimodule l ()
+ Data.Semimodule: instance Data.Semiring.Semiring r => Data.Semimodule.Bisemimodule r r ()
+ Data.Semimodule: instance Data.Semiring.Semiring r => Data.Semimodule.RightSemimodule r ()
+ Data.Semimodule: lscale :: LeftSemimodule l a => l -> a -> a
+ Data.Semimodule: lscaleDef :: Semiring a => Functor f => a -> f a -> f a
+ Data.Semimodule: rscale :: RightSemimodule r a => r -> a -> a
+ Data.Semimodule: rscaleDef :: Semiring a => Functor f => a -> f a -> f a
+ Data.Semimodule: type Basis2 b c f g = (Basis b f, Basis c g)
+ Data.Semimodule: type Basis3 b c d f g h = (Basis b f, Basis c g, Basis d h)
+ Data.Semimodule: type Bimodule l r a = (LeftModule l a, RightModule r a, Bisemimodule l r a)
+ Data.Semimodule: type FreeModule a f = (Free f, Bimodule a a (f a))
+ Data.Semimodule: type FreeSemimodule a f = (Free f, Bisemimodule a a (f a))
+ Data.Semimodule: type LeftModule l a = (Ring l, (Additive - Group) a, LeftSemimodule l a)
+ Data.Semimodule: type RightModule r a = (Ring r, (Additive - Group) a, RightSemimodule r a)
+ Data.Semimodule.Basis: E1 :: E1
+ Data.Semimodule.Basis: E21 :: E2
+ Data.Semimodule.Basis: E22 :: E2
+ Data.Semimodule.Basis: E31 :: E3
+ Data.Semimodule.Basis: E32 :: E3
+ Data.Semimodule.Basis: E33 :: E3
+ Data.Semimodule.Basis: E41 :: E4
+ Data.Semimodule.Basis: E42 :: E4
+ Data.Semimodule.Basis: E43 :: E4
+ Data.Semimodule.Basis: E44 :: E4
+ Data.Semimodule.Basis: E61 :: E6
+ Data.Semimodule.Basis: E62 :: E6
+ Data.Semimodule.Basis: E63 :: E6
+ Data.Semimodule.Basis: E64 :: E6
+ Data.Semimodule.Basis: E65 :: E6
+ Data.Semimodule.Basis: E66 :: E6
+ Data.Semimodule.Basis: data E1
+ Data.Semimodule.Basis: data E2
+ Data.Semimodule.Basis: data E3
+ Data.Semimodule.Basis: data E4
+ Data.Semimodule.Basis: data E6
+ Data.Semimodule.Basis: e1 :: a -> E1 -> a
+ Data.Semimodule.Basis: e2 :: a -> a -> E2 -> a
+ Data.Semimodule.Basis: e3 :: a -> a -> a -> E3 -> a
+ Data.Semimodule.Basis: e4 :: a -> a -> a -> a -> E4 -> a
+ Data.Semimodule.Basis: fillE1 :: Basis E1 f => a -> f a
+ Data.Semimodule.Basis: fillE2 :: Basis E2 f => a -> a -> f a
+ Data.Semimodule.Basis: fillE3 :: Basis E3 f => a -> a -> a -> f a
+ Data.Semimodule.Basis: fillE4 :: Basis E4 f => a -> a -> a -> a -> f a
+ Data.Semimodule.Basis: instance GHC.Classes.Eq Data.Semimodule.Basis.E1
+ Data.Semimodule.Basis: instance GHC.Classes.Eq Data.Semimodule.Basis.E2
+ Data.Semimodule.Basis: instance GHC.Classes.Eq Data.Semimodule.Basis.E3
+ Data.Semimodule.Basis: instance GHC.Classes.Eq Data.Semimodule.Basis.E4
+ Data.Semimodule.Basis: instance GHC.Classes.Eq Data.Semimodule.Basis.E5
+ Data.Semimodule.Basis: instance GHC.Classes.Eq Data.Semimodule.Basis.E6
+ Data.Semimodule.Basis: instance GHC.Classes.Ord Data.Semimodule.Basis.E1
+ Data.Semimodule.Basis: instance GHC.Classes.Ord Data.Semimodule.Basis.E2
+ Data.Semimodule.Basis: instance GHC.Classes.Ord Data.Semimodule.Basis.E3
+ Data.Semimodule.Basis: instance GHC.Classes.Ord Data.Semimodule.Basis.E4
+ Data.Semimodule.Basis: instance GHC.Classes.Ord Data.Semimodule.Basis.E5
+ Data.Semimodule.Basis: instance GHC.Classes.Ord Data.Semimodule.Basis.E6
+ Data.Semimodule.Basis: instance GHC.Show.Show Data.Semimodule.Basis.E1
+ Data.Semimodule.Basis: instance GHC.Show.Show Data.Semimodule.Basis.E2
+ Data.Semimodule.Basis: instance GHC.Show.Show Data.Semimodule.Basis.E3
+ Data.Semimodule.Basis: instance GHC.Show.Show Data.Semimodule.Basis.E4
+ Data.Semimodule.Basis: instance GHC.Show.Show Data.Semimodule.Basis.E5
+ Data.Semimodule.Basis: instance GHC.Show.Show Data.Semimodule.Basis.E6
+ Data.Semimodule.Free: (#.) :: Semiring a => Foldable f => Basis2 b c f g => f a -> (f ** g) a -> g a
+ Data.Semimodule.Free: (*.) :: LeftSemimodule l a => l -> a -> a
+ Data.Semimodule.Free: (.#) :: Semiring a => Foldable g => Basis2 b c f g => (f ** g) a -> g a -> f a
+ Data.Semimodule.Free: (.#.) :: Semiring a => Foldable g => Basis3 b c d f g h => (f ** g) a -> (g ** h) a -> (f ** h) a
+ Data.Semimodule.Free: (.*) :: RightSemimodule r a => a -> r -> a
+ Data.Semimodule.Free: V1 :: a -> V1 a
+ Data.Semimodule.Free: V2 :: !a -> !a -> V2 a
+ Data.Semimodule.Free: V3 :: !a -> !a -> !a -> V3 a
+ Data.Semimodule.Free: V4 :: !a -> !a -> !a -> !a -> V4 a
+ Data.Semimodule.Free: bdet2 :: Semiring a => Basis2 E2 E2 f g => (f ** g) a -> (a, a)
+ Data.Semimodule.Free: bdet3 :: Semiring a => Basis2 E3 E3 f g => (f ** g) a -> (a, a)
+ Data.Semimodule.Free: bdet4 :: Semiring a => Basis2 E4 E4 f g => (f ** g) a -> (a, a)
+ Data.Semimodule.Free: col :: Basis2 b c f g => c -> (f ** g) a -> f a
+ Data.Semimodule.Free: cols :: Basis2 b c f g => f a -> (f ** g) a
+ Data.Semimodule.Free: cross :: Ring a => V3 a -> V3 a -> V3 a
+ Data.Semimodule.Free: data V2 a
+ Data.Semimodule.Free: data V3 a
+ Data.Semimodule.Free: data V4 a
+ Data.Semimodule.Free: det2 :: Ring a => Basis2 E2 E2 f g => (f ** g) a -> a
+ Data.Semimodule.Free: det3 :: Ring a => Basis2 E3 E3 f g => (f ** g) a -> a
+ Data.Semimodule.Free: det4 :: Ring a => Basis2 E4 E4 f g => (f ** g) a -> a
+ Data.Semimodule.Free: diag :: Semiring a => Basis b f => f a -> (f ** f) a
+ Data.Semimodule.Free: diagonal :: Representable f => (f ** f) a -> f a
+ Data.Semimodule.Free: dirac :: Eq i => Semiring a => i -> i -> a
+ Data.Semimodule.Free: dot :: Semiring a => Foldable f => Basis b f => f a -> f a -> a
+ Data.Semimodule.Free: elt :: Basis b f => b -> f a -> a
+ Data.Semimodule.Free: elt2 :: Basis2 b c f g => b -> c -> (f ** g) a -> a
+ Data.Semimodule.Free: grateRep :: Basis b f => forall g. Functor g => (b -> g a1 -> a2) -> (g ** f) a1 -> f a2
+ Data.Semimodule.Free: identity :: Semiring a => Basis b f => (f ** f) a
+ Data.Semimodule.Free: idx :: Semiring a => Basis b f => b -> f a
+ Data.Semimodule.Free: infix 6 `dot`
+ Data.Semimodule.Free: infix 7 #.
+ Data.Semimodule.Free: infixl 7 .*
+ Data.Semimodule.Free: infixr 7 .#.
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Group (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Loop (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Group.Quasigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive Data.Group.Group a => Data.Magma.Magma (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Monoid a => GHC.Base.Monoid (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M12 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M13 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M14 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M21 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M23 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M24 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M31 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M32 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M34 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M41 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M42 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M43 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V1 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V2 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V3 a))
+ Data.Semimodule.Free: instance (Data.Semigroup.Multiplicative.-) Data.Semigroup.Additive.Additive GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Semigroup.Additive.Additive (Data.Semimodule.Free.V4 a))
+ Data.Semimodule.Free: instance Data.Distributive.Distributive Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance Data.Distributive.Distributive Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance Data.Distributive.Distributive Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance Data.Distributive.Distributive Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance Data.Foldable.Foldable Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance Data.Foldable.Foldable Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance Data.Foldable.Foldable Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance Data.Foldable.Foldable Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance Data.Functor.Classes.Eq1 Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance Data.Functor.Classes.Show1 Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance Data.Functor.Rep.Representable Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance Data.Functor.Rep.Representable Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance Data.Functor.Rep.Representable Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance Data.Functor.Rep.Representable Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance Data.Semigroup.Foldable.Class.Foldable1 Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M11 a)
+ Data.Semimodule.Free: instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M22 a)
+ Data.Semimodule.Free: instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M33 a)
+ Data.Semimodule.Free: instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semimodule.Free.M44 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M12 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M13 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M14 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M21 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M23 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M24 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M31 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M32 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M34 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M41 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M42 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M43 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V1 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V2 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V3 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.Bisemimodule a a (Data.Semimodule.Free.V4 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M12 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M13 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M14 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M21 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M23 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M24 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M31 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M32 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M34 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M41 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M42 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M43 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V1 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V2 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V3 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.LeftSemimodule a (Data.Semimodule.Free.V4 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M11 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M21 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M31 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M11 a) (Data.Semimodule.Free.M41 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M12 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M22 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M32 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M22 a) (Data.Semimodule.Free.M42 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M13 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M23 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M33 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M33 a) (Data.Semimodule.Free.M43 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M14 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M24 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M34 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule (Data.Semimodule.Free.M44 a) (Data.Semimodule.Free.M44 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V1 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V2 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V3 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semimodule.RightSemimodule a (Data.Semimodule.Free.V4 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M11 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M22 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M33 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Presemiring (Data.Semimodule.Free.M44 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M11 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M22 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M33 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semimodule.Free.M44 a)
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M11 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M22 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M33 a))
+ Data.Semimodule.Free: instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semigroup.Multiplicative.Multiplicative (Data.Semimodule.Free.M44 a))
+ Data.Semimodule.Free: instance GHC.Base.Applicative Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance GHC.Base.Applicative Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance GHC.Base.Applicative Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance GHC.Base.Applicative Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance GHC.Base.Functor Data.Semimodule.Free.V1
+ Data.Semimodule.Free: instance GHC.Base.Functor Data.Semimodule.Free.V2
+ Data.Semimodule.Free: instance GHC.Base.Functor Data.Semimodule.Free.V3
+ Data.Semimodule.Free: instance GHC.Base.Functor Data.Semimodule.Free.V4
+ Data.Semimodule.Free: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V1 a)
+ Data.Semimodule.Free: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V2 a)
+ Data.Semimodule.Free: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V3 a)
+ Data.Semimodule.Free: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semimodule.Free.V4 a)
+ Data.Semimodule.Free: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V1 a)
+ Data.Semimodule.Free: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V2 a)
+ Data.Semimodule.Free: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V3 a)
+ Data.Semimodule.Free: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semimodule.Free.V4 a)
+ Data.Semimodule.Free: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V1 a)
+ Data.Semimodule.Free: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V2 a)
+ Data.Semimodule.Free: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V3 a)
+ Data.Semimodule.Free: instance GHC.Show.Show a => GHC.Show.Show (Data.Semimodule.Free.V4 a)
+ Data.Semimodule.Free: inv1 :: Field a => M11 a -> M11 a
+ Data.Semimodule.Free: inv2 :: Field a => M22 a -> M22 a
+ Data.Semimodule.Free: inv3 :: Field a => M33 a -> M33 a
+ Data.Semimodule.Free: inv4 :: Field a => M44 a -> M44 a
+ Data.Semimodule.Free: lensRep :: Basis b f => b -> forall g. Functor g => (a -> g a) -> f a -> (g ** f) a
+ Data.Semimodule.Free: lerp :: LeftModule r a => r -> a -> a -> a
+ Data.Semimodule.Free: m11 :: a -> M11 a
+ Data.Semimodule.Free: m12 :: a -> a -> M12 a
+ Data.Semimodule.Free: m13 :: a -> a -> a -> M13 a
+ Data.Semimodule.Free: m14 :: a -> a -> a -> a -> M14 a
+ Data.Semimodule.Free: m21 :: a -> a -> M21 a
+ Data.Semimodule.Free: m22 :: a -> a -> a -> a -> M22 a
+ Data.Semimodule.Free: m23 :: a -> a -> a -> a -> a -> a -> M23 a
+ Data.Semimodule.Free: m24 :: a -> a -> a -> a -> a -> a -> a -> a -> M24 a
+ Data.Semimodule.Free: m31 :: a -> a -> a -> M31 a
+ Data.Semimodule.Free: m32 :: a -> a -> a -> a -> a -> a -> M32 a
+ Data.Semimodule.Free: m33 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> M33 a
+ Data.Semimodule.Free: m34 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> M34 a
+ Data.Semimodule.Free: m41 :: a -> a -> a -> a -> M41 a
+ Data.Semimodule.Free: m42 :: a -> a -> a -> a -> a -> a -> a -> a -> M42 a
+ Data.Semimodule.Free: m43 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> M43 a
+ Data.Semimodule.Free: m44 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> M44 a
+ Data.Semimodule.Free: newtype V1 a
+ Data.Semimodule.Free: outer :: Semiring a => Basis2 b c f g => f a -> g a -> (f ** g) a
+ Data.Semimodule.Free: qd :: FreeModule a f => Foldable f => f a -> f a -> a
+ Data.Semimodule.Free: quadrance :: Semiring a => Foldable f => Basis b f => f a -> a
+ Data.Semimodule.Free: row :: Basis b f => b -> (f ** g) a -> g a
+ Data.Semimodule.Free: rows :: Basis2 b c f g => g a -> (f ** g) a
+ Data.Semimodule.Free: trace :: Semiring a => Foldable f => Basis b f => (f ** f) a -> a
+ Data.Semimodule.Free: tran :: Semiring a => Basis2 b c f g => Foldable g => (f ** g) a -> Tran a b c
+ Data.Semimodule.Free: transpose :: Basis2 b c f g => (f ** g) a -> (g ** f) a
+ Data.Semimodule.Free: triple :: Ring a => V3 a -> V3 a -> V3 a -> a
+ Data.Semimodule.Free: type Basis b f = (Free f, Rep f ~ b)
+ Data.Semimodule.Free: type Basis2 b c f g = (Basis b f, Basis c g)
+ Data.Semimodule.Free: type Basis3 b c d f g h = (Basis b f, Basis c g, Basis d h)
+ Data.Semimodule.Free: type Free f = (Representable f, Eq (Rep f))
+ Data.Semimodule.Free: type M11 = Compose V1 V1
+ Data.Semimodule.Free: type M12 = Compose V1 V2
+ Data.Semimodule.Free: type M13 = Compose V1 V3
+ Data.Semimodule.Free: type M14 = Compose V1 V4
+ Data.Semimodule.Free: type M21 = Compose V2 V1
+ Data.Semimodule.Free: type M22 = Compose V2 V2
+ Data.Semimodule.Free: type M23 = Compose V2 V3
+ Data.Semimodule.Free: type M24 = Compose V2 V4
+ Data.Semimodule.Free: type M31 = Compose V3 V1
+ Data.Semimodule.Free: type M32 = Compose V3 V2
+ Data.Semimodule.Free: type M33 = Compose V3 V3
+ Data.Semimodule.Free: type M34 = Compose V3 V4
+ Data.Semimodule.Free: type M41 = Compose V4 V1
+ Data.Semimodule.Free: type M42 = Compose V4 V2
+ Data.Semimodule.Free: type M43 = Compose V4 V3
+ Data.Semimodule.Free: type M44 = Compose V4 V4
+ Data.Semimodule.Free: unV1 :: V1 a -> a
+ Data.Semimodule.Transform: infixr 1 ++
+ Data.Semimodule.Transform: sbraid :: Dim (a + b) (b + a)
+ Data.Semimodule.Transform: type Dim b c = forall a. Tran a b c
+ Data.Semimodule.Transform: type f ++ g = Product f g
+ Data.Semiring: xmult :: Foldable f => Applicative f => Presemiring a => (Additive - Monoid) a => f a -> f a -> a
+ Data.Semiring: xmult1 :: Foldable1 f => Apply f => Presemiring a => f a -> f a -> a
+ Data.Semiring.Property: distributive_xmult1_on :: Presemiring r => Apply f => Foldable1 f => Rel r b -> f r -> f r -> b
+ Data.Semiring.Property: distributive_xmult_on :: Semiring r => Applicative f => Foldable f => Rel r b -> f r -> f r -> b
- Data.Semifield: infixl 7 /
+ Data.Semifield: infixl 7 \\
- Data.Semigroup.Multiplicative: infixl 7 /
+ Data.Semigroup.Multiplicative: infixl 7 \\
- Data.Semimodule: (*.) :: Semimodule r a => r -> a -> a
+ Data.Semimodule: (*.) :: LeftSemimodule l a => l -> a -> a
- Data.Semimodule: (.*) :: Semimodule r a => a -> r -> a
+ Data.Semimodule: (.*) :: RightSemimodule r a => a -> r -> a
- Data.Semimodule: infixl 7 *.
+ Data.Semimodule: infixl 7 .\
- Data.Semimodule: lerp :: Module r a => r -> a -> a -> a
+ Data.Semimodule: lerp :: LeftModule r a => r -> a -> a -> a
- Data.Semimodule: negateDef :: Semimodule Integer a => a -> a
+ Data.Semimodule: negateDef :: LeftModule Integer a => a -> a
- Data.Semimodule.Transform: ($$$) :: Index a (b -> c) -> Index a b -> Index a c
+ Data.Semimodule.Transform: ($$$) :: Dim a (b -> c) -> Dim a b -> Dim a c
- Data.Semimodule.Transform: (&&&) :: Index a b1 -> Index a b2 -> Index a (b1, b2)
+ Data.Semimodule.Transform: (&&&) :: Dim a b1 -> Dim a b2 -> Dim a (b1, b2)
- Data.Semimodule.Transform: (***) :: Index a1 b1 -> Index a2 b2 -> Index (a1, a2) (b1, b2)
+ Data.Semimodule.Transform: (***) :: Dim a1 b1 -> Dim a2 b2 -> Dim (a1, a2) (b1, b2)
- Data.Semimodule.Transform: (+++) :: Index a1 b1 -> Index a2 b2 -> Index (a1 + a2) (b1 + b2)
+ Data.Semimodule.Transform: (+++) :: Dim a1 b1 -> Dim a2 b2 -> Dim (a1 + a2) (b1 + b2)
- Data.Semimodule.Transform: (|||) :: Index a1 b -> Index a2 b -> Index (a1 + a2) b
+ Data.Semimodule.Transform: (|||) :: Dim a1 b -> Dim a2 b -> Dim (a1 + a2) b
- Data.Semimodule.Transform: adivide :: (a -> (a1, a2)) -> Index a1 b -> Index a2 b -> Index a b
+ Data.Semimodule.Transform: adivide :: (a -> (a1, a2)) -> Dim a1 b -> Dim a2 b -> Dim a b
- Data.Semimodule.Transform: adivide' :: Index a b -> Index a b -> Index a b
+ Data.Semimodule.Transform: adivide' :: Dim a1 b -> Dim a2 b -> Dim (a1, a2) b
- Data.Semimodule.Transform: app :: Basis b f => Basis c g => Tran a b c -> g a -> f a
+ Data.Semimodule.Transform: app :: Basis2 b c f g => Tran a b c -> g a -> f a
- Data.Semimodule.Transform: arr :: (b -> c) -> Index b c
+ Data.Semimodule.Transform: arr :: (b -> c) -> Tran a b c
- Data.Semimodule.Transform: aselect :: ((b1 + b2) -> b) -> Index a b1 -> Index a b2 -> Index a b
+ Data.Semimodule.Transform: aselect :: ((b1 + b2) -> b) -> Dim a b1 -> Dim a b2 -> Dim a b
- Data.Semimodule.Transform: aselect' :: Index a b -> Index a b -> Index a b
+ Data.Semimodule.Transform: aselect' :: Dim a b1 -> Dim a b2 -> Dim a (b1 + b2)
- Data.Semimodule.Transform: braid :: Index (a, b) (b, a)
+ Data.Semimodule.Transform: braid :: Dim (a, b) (b, a)
- Data.Semimodule.Transform: cols :: Free f => Free g => f a -> f (g a)
+ Data.Semimodule.Transform: cols :: Basis2 b c f g => f a -> (f ** g) a
- Data.Semimodule.Transform: compl :: Basis b f1 => Basis c f2 => Free g => Index b c -> f2 (g a) -> f1 (g a)
+ Data.Semimodule.Transform: compl :: Basis3 b c d f1 f2 g => Dim b c -> (f2 ** g) a -> (f1 ** g) a
- Data.Semimodule.Transform: complr :: Basis b1 f1 => Basis c1 f2 => Basis b2 g1 => Basis c2 g2 => Index b1 c1 -> Index b2 c2 -> f2 (g2 a) -> f1 (g1 a)
+ Data.Semimodule.Transform: complr :: Basis2 b1 c1 f1 f2 => Basis2 b2 c2 g1 g2 => Dim b1 c1 -> Dim b2 c2 -> (f2 ** g2) a -> (f1 ** g1) a
- Data.Semimodule.Transform: compr :: Basis b g1 => Basis c g2 => Free f => Index b c -> f (g2 a) -> f (g1 a)
+ Data.Semimodule.Transform: compr :: Basis3 b c d f g1 g2 => Dim c d -> (f ** g2) a -> (f ** g1) a
- Data.Semimodule.Transform: first :: Index b c -> Index (b, d) (c, d)
+ Data.Semimodule.Transform: first :: Dim b c -> Dim (b, d) (c, d)
- Data.Semimodule.Transform: left :: Index b c -> Index (b + d) (c + d)
+ Data.Semimodule.Transform: left :: Dim b c -> Dim (b + d) (c + d)
- Data.Semimodule.Transform: projl :: Free f => Free g => Product f g a -> f a
+ Data.Semimodule.Transform: projl :: Basis2 b c f g => (f ++ g) a -> f a
- Data.Semimodule.Transform: projr :: Free f => Free g => Product f g a -> g a
+ Data.Semimodule.Transform: projr :: Basis2 b c f g => (f ++ g) a -> g a
- Data.Semimodule.Transform: right :: Index b c -> Index (d + b) (d + c)
+ Data.Semimodule.Transform: right :: Dim b c -> Dim (d + b) (d + c)
- Data.Semimodule.Transform: rows :: Free f => Free g => g a -> f (g a)
+ Data.Semimodule.Transform: rows :: Basis2 b c f g => g a -> (f ** g) a
- Data.Semimodule.Transform: second :: Index b c -> Index (d, b) (d, c)
+ Data.Semimodule.Transform: second :: Dim b c -> Dim (d, b) (d, c)
- Data.Semimodule.Transform: transpose :: Free f => Free g => f (g a) -> g (f a)
+ Data.Semimodule.Transform: transpose :: Basis2 b c f g => (f ** g) a -> (g ** f) a
- Data.Semiring: signum :: RingLaw a => Ord a => a -> a
+ Data.Semiring: signum :: Ring a => Ord a => a -> a
- Data.Semiring: two :: (Additive - Semigroup) a => (Multiplicative - Monoid) a => a
+ Data.Semiring: two :: Semiring a => a

Files

rings.cabal view
@@ -1,7 +1,7 @@ name:                rings-version:             0.0.3+version:             0.0.3.1 synopsis:            Ring-like objects.-description:         Semirings, rings, division rings, modules, and algebras.+description:         Semirings, rings, division rings, and modules. homepage:            https://github.com/cmk/rings license:             BSD3 license-file:        LICENSE@@ -20,18 +20,16 @@   ghc-options:      -Wall -optc-std=c99    exposed-modules:-      Data.Algebra-    , Data.Algebra.Quaternion-    , Data.Semiring+      Data.Semiring     , Data.Semiring.Property     , Data.Semifield-    , Data.Semimodule-    , Data.Semimodule.Vector-    , Data.Semimodule.Matrix-    , Data.Semimodule.Transform     , Data.Semigroup.Additive     , Data.Semigroup.Multiplicative     , Data.Semigroup.Property+    , Data.Semimodule+    , Data.Semimodule.Free+    , Data.Semimodule.Basis+    , Data.Semimodule.Transform    default-extensions:       ScopedTypeVariables
− src/Data/Algebra.hs
@@ -1,272 +0,0 @@-{-# LANGUAGE CPP                        #-}-{-# LANGUAGE Safe                       #-}-{-# LANGUAGE PolyKinds                  #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE DefaultSignatures          #-}-{-# LANGUAGE DeriveFunctor              #-}-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE NoImplicitPrelude          #-}-{-# LANGUAGE RebindableSyntax           #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE TypeFamilies               #-}--module Data.Algebra (-    (><)-  , (//)-  , (.@.)-  , unit-  , norm-  , conj-  , triple-  , reciprocal-  , Algebra(..)-  , Composition(..)-  , Unital(..)-  , Division(..)-) where--import safe Data.Bool-import safe Data.Functor.Rep-import safe Data.Semifield-import safe Data.Semigroup.Additive as A-import safe Data.Semigroup.Multiplicative as M-import safe Data.Semimodule-import safe Data.Semiring hiding ((//))-import safe Prelude hiding (Num(..), Fractional(..), sum, product)---- | < https://en.wikipedia.org/wiki/Algebra_over_a_field#Generalization:_algebra_over_a_ring Algebra > over a semiring.------ Needn't be associative or unital.----class Semiring r => Algebra r a where-  multiplyWith :: (a -> a -> r) -> a -> r--infixl 7 ><---- | Multiplication operator on a free algebra.------ In particular this is cross product on the 'I3' basis in /R^3/:------ >>> V3 1 0 0 >< V3 0 1 0 >< V3 0 1 0 :: V3 Int--- V3 (-1) 0 0--- >>> V3 1 0 0 >< (V3 0 1 0 >< V3 0 1 0) :: V3 Int--- V3 0 0 0------ /Caution/ in general (><) needn't be commutative, nor even associative.------ The cross product in particular satisfies the following properties:------ @ --- a '><' a = 'mempty'--- a '><' b = 'negate' ( b '><' a ) , --- a '><' ( b <> c ) = ( a '><' b ) <> ( a '><' c ) , --- ( r a ) '><' b = a '><' ( r b ) = r ( a '><' b ) . --- a '><' ( b '><' c ) <> b '><' ( c '><' a ) <> c '><' ( a '><' b ) = 'mempty' . --- @------ See < https://en.wikipedia.org/wiki/Jacobi_identity Jacobi identity >.------ For associative algebras, use (*) instead for clarity:------ >>> (1 :+ 2) >< (3 :+ 4) :: Complex Int--- (-5) :+ 10--- >>> (1 :+ 2) * (3 :+ 4) :: Complex Int--- (-5) :+ 10--- >>> qi >< qj :: QuatM--- Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)--- >>> qi * qj :: QuatM--- Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)----(><) :: (Representable f, Algebra r (Rep f)) => f r -> f r -> f r-(><) x y = tabulate $ multiplyWith (\i1 i2 -> index x i1 * index y i2)---- | Scalar triple product.------ @--- 'triple' x y z = 'triple' z x y = 'triple' y z x--- 'triple' x y z = 'negate' '$' 'triple' x z y = 'negate' '$' 'triple' y x z--- 'triple' x x y = 'triple' x y y = 'triple' x y x = 'zero'--- ('triple' x y z) '*.' x = (x '><' y) '><' (x '><' z)--- @------ >>> triple (V3 0 0 1) (V3 1 0 0) (V3 0 1 0) :: Double--- 1.0----triple :: Free f => Foldable f => Algebra a (Rep f) => f a -> f a -> f a -> a-triple x y z = x .*. (y >< z)-{-# INLINE triple #-}---- | < https://en.wikipedia.org/wiki/Composition_algebra Composition algebra > over a free semimodule.----class Algebra r a => Composition r a where-  conjugateWith :: (a -> r) -> a -> r--  normWith :: (a -> r) -> r-  ---- @ 'conj' a '><' 'conj' b = 'conj' (b >< a) @---prop_conj :: Representable f => Foldable f => Semiring b => Composition a (Rep f) => Rel a b -> f a -> f a -> b---prop_conj (~~) p q = sum $ mzipWithRep (~~) (conj (p >< q)) (conj q >< conj p)---- @ 'conj' a '><' 'conj' b = 'conj' (b >< a) @-conj :: Representable f => Composition r (Rep f) => f r -> f r-conj = tabulate . conjugateWith . index---- | Norm of a composition algebra.------ @ --- 'norm' x '*' 'norm' y = 'norm' (x >< y)--- 'norm' . 'norm'' $ x = 'norm' x '*' 'norm' x--- @----norm :: (Representable f, Composition r (Rep f)) => f r -> r-norm x = normWith $ index x----norm' :: (Representable f, Composition r (Rep f)) => f r -> f r---norm' x = x >< conj x--class (Semiring r, Algebra r a) => Unital r a where-  unitWith :: r -> a -> r---- | Unit of a unital algebra.------ >>> unit :: Complex Int--- 1 :+ 0--- >>> unit :: QuatD--- Quaternion 1.0 (V3 0.0 0.0 0.0)----unit :: Representable f => Unital r (Rep f) => f r-unit = tabulate $ unitWith one---- | A (not necessarily associative) < https://en.wikipedia.org/wiki/Division_algebra division algebra >.----class (Semifield r, Unital r a) => Division r a where-  --divideWith :: (a -> a -> r) -> a -> r--  reciprocalWith :: (a -> r) -> a -> r-  ------ | @ 'reciprocal' x = (/ 'quadrance' x) '<$>' 'conj' x@-reciprocal :: Representable f => Division a (Rep f) => f a -> f a-reciprocal = tabulate . reciprocalWith . index---- reciprocal' x = (/ quadrance x) <$> conj x---infixl 7 //---- | Division operator on a free division algebra.------ >>> (1 :+ 0) // (0 :+ 1)--- 0.0 :+ (-1.0)----(//) :: Representable f => Division r (Rep f) => f r -> f r -> f r-(//) x y = x >< reciprocal y--infix 6 .@. --- | Bilinear form on a free composition algebra.------ >>> V2 1 2 .@. V2 1 2--- 5.0--- >>> V2 1 2 .@. V2 2 (-1)--- 0.0--- >>> V3 1 1 1 .@. V3 1 1 (-2)--- 0.0--- --- >>> (1 :+ 2) .@. (2 :+ (-1)) :: Double--- 0.0------ >>> qi .@. qj :: Double--- 0.0--- >>> qj .@. qk :: Double--- 0.0--- >>> qk .@. qi :: Double--- 0.0--- >>> qk .@. qk :: Double--- 1.0----(.@.) :: Representable f => Composition a (Rep f) => Semigroup (f a) => Field a => f a -> f a -> a-x .@. y = prod / two where prod = norm (x <> y) - norm x - norm y-------------------------------------------------------------------------- Instances---------------------------------------------------------------------------instance (Semiring r, Unital r a) => Unital r (a -> r) where---  unitWith = unitWith one----instance (Semiring r, Division r a) => Division r (a -> r) where---  reciprocalWith = reciprocalWith---- incoherent--- instance Unital () a where unitWith _ _ = ()--- instance (Unital r a, Unital r b) => Unital (a -> r) b where unitWith f b a = unitWith (f a) b--instance Semiring r => Algebra r () where-  multiplyWith f = f ()--instance Semiring r => Unital r () where-  unitWith r () = r--instance (Algebra r a, Algebra r b) => Algebra r (a,b) where-  multiplyWith f (a,b) = multiplyWith (\a1 a2 -> multiplyWith (\b1 b2 -> f (a1,b1) (a2,b2)) b) a--instance (Algebra r a, Algebra r b, Algebra r c) => Algebra r (a,b,c) where-  multiplyWith f (a,b,c) = multiplyWith (\a1 a2 -> multiplyWith (\b1 b2 -> multiplyWith (\c1 c2 -> f (a1,b1,c1) (a2,b2,c2)) c) b) a--instance (Unital r a, Unital r b) => Unital r (a,b) where-  unitWith r (a,b) = unitWith r a * unitWith r b--instance (Unital r a, Unital r b, Unital r c) => Unital r (a,b,c) where-  unitWith r (a,b,c) = unitWith r a * unitWith r b * unitWith r c---- | Tensor algebra------ >>> multiplyWith (<>) [1..3 :: Int]--- [1,2,3,1,2,3,1,2,3,1,2,3]------ >>> multiplyWith (\f g -> fold (f ++ g)) [1..3] :: Int--- 24----instance Semiring r => Algebra r [a] where-  multiplyWith f = go [] where-    go ls rrs@(r:rs) = f (reverse ls) rrs + go (r:ls) rs-    go ls [] = f (reverse ls) []--instance Semiring r => Unital r [a] where-  unitWith r [] = r-  unitWith _ _ = zero--type ComplexBasis = Bool---- Complex basis---instance Module r ComplexBasis => Algebra r ComplexBasis where-instance Ring r => Algebra r ComplexBasis where-  multiplyWith f = f' where-    fe = f False False - f True True-    fi = f False True + f True False-    f' False = fe-    f' True = fi----instance Module r ComplexBasis => Composition r ComplexBasis where-instance Ring r => Composition r ComplexBasis where-  conjugateWith f = f' where-    afe = f False-    nfi = negate (f True)-    f' False = afe-    f' True = nfi--  normWith f = flip multiplyWith zero $ \i1 i2 -> f i1 * conjugateWith f i2----instance Module r ComplexBasis => Unital r ComplexBasis where-instance Ring r => Unital r ComplexBasis where-  unitWith x False = x-  unitWith _ _ = zero--instance Field r => Division r ComplexBasis where-  reciprocalWith f i = conjugateWith f i / normWith f 
− src/Data/Algebra/Quaternion.hs
@@ -1,247 +0,0 @@-{-# LANGUAGE CPP                        #-}-{-# LANGUAGE Safe                       #-}-{-# LANGUAGE PolyKinds                  #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE DefaultSignatures          #-}-{-# LANGUAGE DeriveFunctor              #-}-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}---{-# LANGUAGE RebindableSyntax           #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE TypeFamilies               #-}---- | See the /spatial-math/ package for usage.-module Data.Algebra.Quaternion where--import safe Data.Algebra-import safe Data.Distributive-import safe Data.Fixed-import safe Data.Functor.Rep-import safe Data.Semifield-import safe Data.Semigroup.Foldable-import safe Data.Semimodule-import safe Data.Semimodule.Vector-import safe Data.Semiring-import safe GHC.Generics hiding (Rep)-import safe Prelude hiding (Num(..), Fractional(..), sum, product)--{- need tolerances:-λ> prop_conj q12 (q3 :: QuatP)-False-λ> prop_conj q14 (q3 :: QuatP)-False--prop_conj :: Ring a => (a -> a -> Bool) -> Quaternion a -> Quaternion a -> Bool-prop_conj (~~) p q = sum $ mzipWithRep (~~) (conj (p * q)) (conj q * conj p)---- conj (p * q) = conj q * conj p--- conj q = (-0.5) * (q <> (i * q * i) <> (j * q * j) <> (k * q * k))--- 2 * real q '==' q <> conj q--- 2 * imag q '==' q << conj q-conj :: Group a => Quaternion a -> Quaternion a-conj (Quaternion r v) = Quaternion r $ fmap negate v---- TODO: add to Property module-prop_conj' :: Field a => Rel (Quaternion a) b -> Quaternion a -> b-prop_conj' (~~) q = (conj q) ~~ (conj' q) where-  conj' q = ((one / negate two) *) <$> q <> (qi * q * qi) <> (qj * q * qj) <> (qk * q * qk)--}------type QuatF = Quaternion Float-type QuatD = Quaternion Double-type QuatR = Quaternion Rational-type QuatM = Quaternion Micro-type QuatN = Quaternion Nano-type QuatP = Quaternion Pico--data Quaternion a = Quaternion !a {-# UNPACK #-}! (V3 a) deriving (Eq, Ord, Show, Generic, Generic1)---- | Obtain a 'Quaternion' from 4 base field elements.----quat :: a -> a -> a -> a -> Quaternion a-quat r x y z = Quaternion r (V3 x y z)---- | Real or scalar part of a quaternion.----scal :: Quaternion a -> a-scal (Quaternion r _) = r--vect :: Quaternion a -> V3 a-vect (Quaternion _ v) = v---- | Use a quaternion to rotate a vector.------ >>> rotate qk . rotate qj $ V3 1 1 0 :: V3 Int--- V3 1 (-1) 0----rotate :: Ring a => Quaternion a -> V3 a -> V3 a-rotate q v = v' where Quaternion _ v' = q * Quaternion zero v * conj q---- | Scale a 'QuatD' to unit length.------ >>> normalize $ normalize $ quat 2.0 2.0 2.0 2.0--- Quaternion 0.5 (V3 0.5 0.5 0.5)----normalize :: QuatD -> QuatD-normalize q = 1.0 / (sqrt $ norm q) *. q------------------------------------------------------------------------------------ Standard quaternion basis elements------------------------------------------------------------------------------------ | The real quaternion.------ Represents no rotation.------ 'qe' = 'unit'----qe :: Semiring a => Quaternion a-qe = idx Nothing---- | The /i/ quaternion.------ Represents a \( \pi \) radian rotation about the /x/ axis.------ >>> rotate (qi :: QuatM) $ V3 1 0 0--- V3 1.000000 0.000000 0.000000--- >>> rotate (qi :: QuatM) $ V3 0 1 0--- V3 0.000000 -1.000000 0.000000--- >>> rotate (qi :: QuatM) $ V3 0 0 1--- V3 0.000000 0.000000 -1.000000------ >>> qi * qj--- Quaternion 0 (V3 0 0 1)----qi :: Semiring a => Quaternion a-qi = idx (Just I31)---- | The /j/ quaternion.------ Represents a \( \pi \) radian rotation about the /y/ axis.------ >>> rotate (qj :: QuatM) $ V3 1 0 0--- V3 -1.000000 0.000000 0.000000--- >>> rotate (qj :: QuatM) $ V3 0 1 0--- V3 0.000000 1.000000 0.000000--- >>> rotate (qj :: QuatM) $ V3 0 0 1--- V3 0.000000 0.000000 -1.000000------ >>> qj * qk--- Quaternion 0 (V3 1 0 0)----qj :: Semiring a => Quaternion a-qj = idx (Just I32)---- | The /k/ quaternion.------ Represents a \( \pi \) radian rotation about the /z/ axis.------ >>> rotate (qk :: QuatM) $ V3 1 0 0--- V3 -1.000000 0.000000 0.000000--- >>> rotate (qk :: QuatM) $ V3 0 1 0--- V3 0.000000 -1.000000 0.000000--- >>> rotate (qk :: QuatM) $ V3 0 0 1--- V3 0.000000 0.000000 1.000000------ >>> qk * qi--- Quaternion 0 (V3 0 1 0)--- >>> qi * qj * qk--- Quaternion (-1) (V3 0 0 0)----qk :: Semiring a => Quaternion a-qk = idx (Just I33)------------------------------------------------------------------------------------ Instances----------------------------------------------------------------------------------instance (Additive-Semigroup) a => Semigroup (Quaternion a) where-  (<>) = mzipWithRep (+) --instance (Additive-Monoid) a => Monoid (Quaternion a) where-  mempty = pureRep zero--instance (Additive-Group) a => Magma (Quaternion a) where-  (<<) = mzipWithRep (-)--instance (Additive-Group) a => Quasigroup (Quaternion a)--instance (Additive-Group) a => Loop (Quaternion a)--instance (Additive-Group) a => Group (Quaternion a)--instance (Additive-Group) a => Magma (Additive (Quaternion a)) where-  (<<) = mzipWithRep (<<)--instance (Additive-Group) a => Quasigroup (Additive (Quaternion a))--instance (Additive-Group) a => Loop (Additive (Quaternion a))--instance (Additive-Group) a => Group (Additive (Quaternion a))--instance Semiring a => Semimodule a (Quaternion a) where-  (*.) = multl--instance (Additive-Semigroup) a => Semigroup (Additive (Quaternion a)) where-  (<>) = mzipWithRep (<>)--instance (Additive-Monoid) a => Monoid (Additive (Quaternion a)) where-  mempty = pure mempty--instance Ring a => Semigroup (Multiplicative (Quaternion a)) where-  -- >>> qi * qj :: QuatM-  -- Quaternion 0.000000 (V3 0.000000 0.000000 1.000000)-  -- >>> qk * qi :: QuatM-  -- Quaternion 0.000000 (V3 0.000000 1.000000 0.000000)-  -- >>> qj * qk :: QuatM-  -- Quaternion 0.000000 (V3 1.000000 0.000000 0.000000)-  (<>) = mzipWithRep (><)--instance Ring a => Monoid (Multiplicative (Quaternion a)) where-  mempty = pure unit--instance Ring a => Presemiring (Quaternion a)--instance Ring a => Semiring (Quaternion a)--instance Ring a => Ring (Quaternion a)--instance Functor Quaternion where-  fmap f (Quaternion r v) = Quaternion (f r) (fmap f v)-  {-# INLINE fmap #-}--  a <$ _ = Quaternion a (V3 a a a)-  {-# INLINE (<$) #-}--instance Foldable Quaternion where-  foldMap f (Quaternion e v) = f e <> foldMap f v-  {-# INLINE foldMap #-}-  foldr f z (Quaternion e v) = f e (foldr f z v)-  {-# INLINE foldr #-}-  null _ = False-  length _ = 4--instance Foldable1 Quaternion where-  foldMap1 f (Quaternion r v) = f r <> foldMap1 f v-  {-# INLINE foldMap1 #-}--instance Distributive Quaternion where-  distribute f = Quaternion (fmap (\(Quaternion x _) -> x) f) $ V3-    (fmap (\(Quaternion _ (V3 y _ _)) -> y) f)-    (fmap (\(Quaternion _ (V3 _ z _)) -> z) f)-    (fmap (\(Quaternion _ (V3 _ _ w)) -> w) f)-  {-# INLINE distribute #-}--instance Representable Quaternion where-  type Rep Quaternion = Maybe I3--  tabulate f = Quaternion (f Nothing) (V3 (f $ Just I31) (f $ Just I32) (f $ Just I33))-  {-# INLINE tabulate #-}--  index (Quaternion r v) = maybe r (index v)-  {-# INLINE index #-}
src/Data/Semifield.hs view
@@ -10,82 +10,88 @@ {-# LANGUAGE TypeOperators              #-}  module Data.Semifield (-    (/)-  , (^^)+  -- * Semifields+    type SemifieldLaw, Semifield+  , anan, pinf+  , (/), (\\), (^^)   , recip-  , anan-  , pinf+  -- * Fields+  , type FieldLaw, Field, Real   , ninf-  , type SemifieldLaw, Semifield-  , type FieldLaw, Field ) where -import safe Data.Bool import safe Data.Complex import safe Data.Fixed-import safe Data.Foldable as Foldable (fold, foldl')-import safe Data.Int import safe Data.Semiring-import safe Data.Semigroup.Foldable as Foldable1-import safe Data.Semigroup.Additive import safe Data.Semigroup.Multiplicative -import safe Data.Tuple-import safe Data.Word-import safe GHC.Real hiding (Fractional(..), (^^), (^), div)+import safe GHC.Real hiding (Real, Fractional(..), (^^), (^), div) import safe Numeric.Natural import safe Foreign.C.Types (CFloat(..),CDouble(..)) -import Prelude ( Eq(..), Ord(..), Show(..), Applicative(..), Functor(..), Monoid(..), Semigroup(..), (.), ($), flip, (<$>), Integer, fromInteger, Float, Double)-import qualified Prelude as P+import Prelude (Monoid(..) , Float, Double) -infixr 8 ^^+-------------------------------------------------------------------------------+-- Semifields+------------------------------------------------------------------------------- --- @ 'one' '==' a '^^' 0 @+type SemifieldLaw a = ((Additive-Monoid) a, (Multiplicative-Group) a)++-- | A semifield, near-field, division ring, or associative division algebra. ----- >>> 8 ^^ 0 :: Double--- 1.0--- >>> 8 ^^ 0 :: Pico--- 1.000000000000+-- Instances needn't have commutative multiplication or additive inverses,+-- however addition and multiplication must be associative as usual. ---(^^) :: (Multiplicative-Group) a => a -> Integer -> a-a ^^ n = unMultiplicative $ greplicate n (Multiplicative a)---- | Take the reciprocal of a multiplicative group element.+-- See also the wikipedia definitions of: ----- >>> 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+-- * < https://en.wikipedia.org/wiki/Semifield semifield >+-- * < https://en.wikipedia.org/wiki/Near-field_(mathematics) near-field >+-- * < https://en.wikipedia.org/wiki/Division_ring division ring >+-- * < https://en.wikipedia.org/wiki/Division_algebra division algebra >. -- -recip :: (Multiplicative-Group) a => a -> a -recip a = one / a-{-# INLINE recip #-}+class (Semiring a, SemifieldLaw a) => Semifield a +-- | The /NaN/ value of the semifield.+--+-- @ 'anan' = 'zero' '/' 'zero' @+-- anan :: Semifield a => a anan = zero / zero {-# INLINE anan #-} +-- | The positive infinity of the semifield.+--+-- @ 'pinf' = 'one' '/' 'zero' @+-- pinf :: Semifield a => a pinf = one / zero {-# INLINE pinf #-} -ninf :: Field a => a-ninf = negate one / zero-{-# INLINE ninf #-}+-------------------------------------------------------------------------------+-- Fields+------------------------------------------------------------------------------- --- Sometimes called a division ring-type SemifieldLaw a = ((Additive-Monoid) a, (Multiplicative-Group) a)+type FieldLaw a = ((Additive-Group) a, (Multiplicative-Group) a) --- | A semifield, near-field, division ring, or associative division algebra.+-- | A < https://en.wikipedia.org/wiki/Field_(mathematics) field >. ----- Instances needn't have commutative multiplication or additive inverses.+class (Ring a, Semifield a, FieldLaw a) => Field a++-- | A type modeling the real numbers. ----- See also the wikipedia definitions of < https://en.wikipedia.org/wiki/Semifield semifield >, < https://en.wikipedia.org/wiki/Near-field_(mathematics) near-field >, < https://en.wikipedia.org/wiki/Division_ring division ring >, and < https://en.wikipedia.org/wiki/Division_algebra division algebra >.--- -class (Semiring a, SemifieldLaw a) => Semifield a+class Field a => Real a +-- | The 'one' '/' 'zero' value of the field.+--+-- @ 'ninf' = 'negate' 'one' '/' 'zero' @+--+ninf :: Field a => a+ninf = negate one / zero+{-# INLINE ninf #-}++-------------------------------------------------------------------------------+-- Instances+-------------------------------------------------------------------------------+ instance Semifield () instance Semifield (Ratio Natural) instance Semifield Rational@@ -105,10 +111,7 @@  instance Field a => Semifield (Complex a) -type FieldLaw a = ((Additive-Group) a, (Multiplicative-Group) a) -class (Ring a, Semifield a, FieldLaw a) => Field a- instance Field () instance Field Rational @@ -127,9 +130,8 @@  instance Field a => Field (Complex a) -{--class (Ord a, Field a) => Real a + instance Real Rational  instance Real Uni@@ -144,5 +146,3 @@ instance Real Double instance Real CFloat instance Real CDouble--}-
src/Data/Semigroup/Additive.hs view
@@ -20,31 +20,36 @@ import safe Data.Distributive import safe Data.Functor.Rep import safe Data.Fixed-import safe Data.Foldable hiding (sum) import safe Data.Group import safe Data.Int-import safe Data.List import safe Data.List.NonEmpty import safe Data.Ord import safe Data.Semigroup-import safe Data.Semigroup.Foldable import safe Data.Semigroup.Multiplicative-import safe Data.Tuple import safe Data.Word import safe Foreign.C.Types (CFloat(..),CDouble(..)) import safe GHC.Generics (Generic) import safe GHC.Real hiding (Fractional(..), div, (^^), (^), (%)) import safe Numeric.Natural -import safe Prelude ( Eq(..), Ord(..), Show, Ordering(..), Bounded(..), Applicative(..), Functor(..), Monoid(..), Semigroup(..), (.), ($), flip, (<$>), Integer, Float, Double)+import safe Prelude+ ( Eq(..), Ord(..), Show, Applicative(..), Functor(..), Monoid(..), Semigroup(..)+ , (.), ($), (<$>), Integer, Float, Double) import safe qualified Prelude as P -import qualified Data.Map as Map-import qualified Data.Set as Set-import qualified Data.IntMap as IntMap-import qualified Data.IntSet as IntSet+import safe qualified Data.Map as Map+import safe qualified Data.Set as Set+import safe qualified Data.IntMap as IntMap+import safe qualified Data.IntSet as IntSet  +-- | A commutative 'Semigroup' under '+'.+newtype Additive a = Additive { unAdditive :: a } deriving (Eq, Generic, Ord, Show, Functor)++zero :: (Additive-Monoid) a => a+zero = unAdditive mempty+{-# INLINE zero #-}+ infixl 6 +  -- >>> Dual [2] + Dual [3] :: Dual [Int]@@ -59,13 +64,24 @@ a - b = unAdditive (Additive a << Additive b) {-# INLINE (-) #-} -zero :: (Additive-Monoid) a => a-zero = unAdditive mempty-{-# INLINE zero #-}+negate :: (Additive-Group) a => a -> a+negate a = zero - a+{-# INLINE negate #-} --- | A commutative 'Semigroup' under '+'.-newtype Additive a = Additive { unAdditive :: a } deriving (Eq, Generic, Ord, Show, Functor)+-- | Absolute value of an element.+--+-- @ 'abs' r = 'mul' r ('signum' r) @+--+-- https://en.wikipedia.org/wiki/Linearly_ordered_group+abs :: (Additive-Group) a => Ord a => a -> a+abs x = bool (negate x) x $ zero <= x+{-# INLINE abs #-} +-------------------------------------------------------------------------------+-- Instances+-------------------------------------------------------------------------------++ instance Applicative Additive where   pure = Additive   Additive f <*> Additive a = Additive (f a)@@ -84,7 +100,6 @@   - {- newtype Ordered a = Ordered { unOrdered :: a } deriving (Eq, Generic, Ord, Show, Functor) @@ -151,7 +166,6 @@ -}  - --------------------------------------------------------------------- -- Num-based ---------------------------------------------------------------------@@ -505,22 +519,31 @@ -- instance (Meet-Monoid) (Down a) => Monoid (Meet (Down a)) where mempty = Down <$> mempty  instance ((Additive-Semigroup) a, (Additive-Semigroup) b) => Semigroup (Additive (a, b)) where-  Additive (x1, y1) <> Additive (x2, y2) = Additive (x1 + x2, y1 + y2)+  (<>) = liftA2 $ \(x1,y1) (x2,y2) -> (x1+x2, y1+y2) +instance ((Additive-Monoid) a, (Additive-Monoid) b) => Monoid (Additive (a, b)) where+  mempty = pure (zero, zero)++instance ((Additive-Semigroup) a, (Additive-Semigroup) b, (Additive-Semigroup) c) => Semigroup (Additive (a, b, c)) where+  (<>) = liftA2 $ \(x1,y1,z1) (x2,y2,z2) -> (x1+x2, y1+y2, z1+z2)++instance ((Additive-Monoid) a, (Additive-Monoid) b, (Additive-Monoid) c) => Monoid (Additive (a, b, c)) where+  mempty = pure (zero, zero, zero)+ instance (Additive-Semigroup) a => Semigroup (Additive (Maybe a)) where   Additive (Just x) <> Additive (Just y) = Additive . Just $ x + y   Additive (x@Just{}) <> _           = Additive x   Additive Nothing  <> y             = y +instance (Additive-Semigroup) a => Monoid (Additive (Maybe a)) where+  mempty = Additive Nothing+ instance ((Additive-Semigroup) a, (Additive-Semigroup) b) => Semigroup (Additive (Either a b)) where   Additive (Right x) <> Additive (Right y) = Additive . Right $ x + y    Additive(x@Right{}) <> _     = Additive x   Additive (Left x)  <> Additive (Left y)  = Additive . Left $ x + y   Additive (Left _)  <> y     = y--instance (Additive-Semigroup) a => Monoid (Additive (Maybe a)) where-  mempty = Additive Nothing  instance Ord a => Semigroup (Additive (Set.Set a)) where   (<>) = liftA2 Set.union 
src/Data/Semigroup/Multiplicative.hs view
@@ -15,69 +15,96 @@ import safe Data.Ord import safe Control.Applicative import safe Data.Bool-import safe Data.Complex+import safe Data.Distributive+import safe Data.Functor.Rep import safe Data.Maybe import safe Data.Either import safe Data.Fixed-import safe Data.Foldable as Foldable (Foldable, foldr', foldl') import safe Data.Group import safe Data.Int-import safe Data.List-import safe Data.List.NonEmpty import safe Data.Semigroup-import safe Data.Semigroup.Foldable as Foldable1-import safe Data.Tuple import safe Data.Word import safe Foreign.C.Types (CFloat(..),CDouble(..)) import safe GHC.Generics (Generic) import safe GHC.Real hiding (Fractional(..), div, (^^), (^)) import safe Numeric.Natural---import safe Prelude ( Eq, Ord, Show, Applicative(..), Functor(..), Monoid(..), Semigroup(..), (.), ($), flip, (<$>), Integer, Float, Double)-import safe qualified Prelude as P -import safe Prelude ( Eq(..), Ord, Show, Ordering(..), Bounded(..), Applicative(..), Functor(..), Monoid(..), Semigroup(..), (.), ($), flip, (<$>), Integer, Float, Double)-import safe qualified Prelude as P+import safe Prelude+ ( Eq(..), Ord, Show, Applicative(..), Functor(..), Monoid(..)+ , Semigroup(..), (.), ($), flip, (<$>), Integer, Float, Double) -import qualified Data.Map as Map-import qualified Data.Set as Set-import qualified Data.IntMap as IntMap-import qualified Data.IntSet as IntSet-import qualified Data.Sequence as Seq+import safe qualified Prelude as P+import safe qualified Data.Map as Map+import safe qualified Data.Set as Set+import safe qualified Data.IntMap as IntMap+import safe qualified Data.IntSet as IntSet  -import safe Data.Distributive-import safe Data.Functor.Rep- infixr 1 -  -- | Hyphenation operator. type (g - f) a = f (g a)   -infixl 7 *+-- | A (potentially non-commutative) 'Semigroup' under '+'.+newtype Multiplicative a = Multiplicative { unMultiplicative :: a } deriving (Eq, Generic, Ord, Show, Functor) +one :: (Multiplicative-Monoid) a => a+one = unMultiplicative mempty+{-# INLINE one #-}++infixl 7 *, \\, /+ -- >>> Dual [2] * Dual [3] :: Dual [Int] -- Dual {getDual = [5]} (*) :: (Multiplicative-Semigroup) a => a -> a -> a a * b = unMultiplicative (Multiplicative a <> Multiplicative b) {-# INLINE (*) #-} -infixl 7 /- (/) :: (Multiplicative-Group) a => a -> a -> a a / b = unMultiplicative (Multiplicative a << Multiplicative b) {-# INLINE (/) #-} +-- | Left division by a multiplicative group element.+--+-- When '*' is commutative we must have:+--+-- @ x '\\' y = y '/' x @+--+(\\) :: (Multiplicative-Group) a => a -> a -> a+(\\) x y = recip x * y +infixr 8 ^^ -one :: (Multiplicative-Monoid) a => a-one = unMultiplicative mempty-{-# INLINE one #-}+-- | 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+a ^^ n = unMultiplicative $ greplicate n (Multiplicative a) -div :: (Multiplicative-Group) a => a -> a -> a-a `div` b = unMultiplicative (Multiplicative a << Multiplicative b)-{-# INLINE div #-}+-- | 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 +recip a = one / a+{-# INLINE recip #-} -newtype Multiplicative a = Multiplicative { unMultiplicative :: a } deriving (Eq, Generic, Ord, Show, Functor)  instance Applicative Multiplicative where   pure = Multiplicative@@ -96,7 +123,7 @@   {-# INLINE index #-}  ------------------------------------------------------------------------ Num-based instances+-- Instances ---------------------------------------------------------------------  #define deriveMultiplicativeSemigroup(ty)       \@@ -327,7 +354,7 @@  instance (Multiplicative-Semigroup) a => Semigroup (Multiplicative (Maybe a)) where   Multiplicative Nothing  <> _             = Multiplicative Nothing-  Multiplicative (x@Just{}) <> Multiplicative Nothing   = Multiplicative Nothing+  Multiplicative (Just{}) <> Multiplicative Nothing   = Multiplicative Nothing   Multiplicative (Just x) <> Multiplicative (Just y) = Multiplicative . Just $ x * y   -- Mul a <> Mul b = Mul $ liftA2 (*) a b @@ -336,7 +363,7 @@  instance ((Multiplicative-Semigroup) a, (Multiplicative-Semigroup) b) => Semigroup (Multiplicative (Either a b)) where   Multiplicative (Right x) <> Multiplicative (Right y) = Multiplicative . Right $ x * y-  Multiplicative(x@Right{}) <> y     = y+  Multiplicative (Right{}) <> y     = y   Multiplicative (Left x) <> Multiplicative (Left y)  = Multiplicative . Left $ x * y   Multiplicative (x@Left{}) <> _     = Multiplicative x 
src/Data/Semigroup/Property.hs view
@@ -1,31 +1,30 @@ {-# Language AllowAmbiguousTypes #-} {-# LANGUAGE Safe #-} -module Data.Semigroup.Property where-{- (+module Data.Semigroup.Property (   -- * Required properties of semigroups     associative_addition_on    , associative_multiplication_on   -- * Required properties of monoids   , neutral_addition_on   , neutral_multiplication_on-  -- * Required properties of semigroup & monoid morphisms-  , morphism_additive_on-  , morphism_multiplicative_on-  , morphism_additive_on'-  , morphism_multiplicative_on'   -- * Properties of commuative semigroups   , commutative_addition_on    , commutative_multiplication_on-  -- * Properties of idempotent semigroups-  , idempotent_addition_on-  , idempotent_multiplication_on   -- * Properties of cancellative semigroups   , cancellative_addition_on   , cancellative_multiplication_on+  -- * Properties of idempotent semigroups+  , idempotent_addition_on+  , idempotent_multiplication_on+  -- * Required properties of semigroup & monoid morphisms+  , morphism_additive_on+  , morphism_multiplicative_on+  , morphism_additive_on'+  , morphism_multiplicative_on' ) where--} + import safe Test.Logic (Rel) import safe Data.Semigroup.Additive import safe Data.Semigroup.Multiplicative@@ -34,7 +33,7 @@  import safe Prelude hiding (Num(..), sum) -{-+ ------------------------------------------------------------------------------------ -- Required properties of semigroups @@ -45,7 +44,7 @@ -- This is a required property. -- associative_addition_on :: (Additive-Semigroup) r => Rel r b -> r -> r -> r -> b-associative_addition_on (~~) = Prop.associative_on (~~) add +associative_addition_on (~~) = Prop.associative_on (~~) (+)   -- | \( \forall a, b, c \in R: (a * b) * c \sim a * (b * c) \) --@@ -54,7 +53,7 @@ -- This is a required property. -- associative_multiplication_on :: (Multiplicative-Semigroup) r => Rel r b -> r -> r -> r -> b-associative_multiplication_on (~~) = Prop.associative_on (~~) mul +associative_multiplication_on (~~) = Prop.associative_on (~~) (*)   ------------------------------------------------------------------------------------ -- Required properties of monoids@@ -64,44 +63,120 @@ -- A semigroup with a right-neutral additive identity must satisfy: -- -- @--- 'neutral_addition' 'zero' ~~ const True+-- 'neutral_addition' 'zero' = const True -- @ --  -- Or, equivalently: -- -- @--- 'zero' '+' r ~~ r+-- 'zero' '+' r = r -- @ -- -- This is a required property for additive monoids. -- neutral_addition_on :: (Additive-Monoid) r => Rel r b -> r -> b-neutral_addition_on (~~) = Prop.neutral_on (~~) add zero+neutral_addition_on (~~) = Prop.neutral_on (~~) (+) zero  -- | \( \forall a \in R: (o * a) \sim a \) -- -- A semigroup with a right-neutral multiplicative identity must satisfy: -- -- @--- 'neutral_multiplication' 'one' ~~ const True+-- 'neutral_multiplication' 'one' = const True -- @ --  -- Or, equivalently: -- -- @--- 'one' '*' r ~~ r+-- 'one' '*' r = r -- @ -- -- This is a required propert for multiplicative monoids. -- neutral_multiplication_on :: (Multiplicative-Monoid) r => Rel r b -> r -> b-neutral_multiplication_on (~~) = Prop.neutral_on (~~) mul one+neutral_multiplication_on (~~) = Prop.neutral_on (~~) (*) one --}+------------------------------------------------------------------------------------+-- Properties of commutative semigroups +-- | \( \forall a, b \in R: a + b \sim b + a \)+--+-- 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+commutative_addition_on (~~) = Prop.commutative_on (~~) (+) ++-- | \( \forall a, b \in R: a * b \sim b * a \)+--+-- This is a an /optional/ property for semigroups, and a /optional/ property for semirings.+-- It is a /required/ property for rings.+--+commutative_multiplication_on :: (Multiplicative-Semigroup) r => Rel r b -> r -> r -> b+commutative_multiplication_on (~~) = Prop.commutative_on (~~) (*) + ------------------------------------------------------------------------------------+-- Properties of cancellative semigroups++-- | \( \forall a, b, c \in R: b + a \sim c + a \Rightarrow b = c \)+--+-- 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+cancellative_addition_on (~~) a = Prop.injective_on (~~) (+ a)++-- | \( \forall a, b, c \in R: b * a \sim c * a \Rightarrow b = c \)+--+-- 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+cancellative_multiplication_on (~~) a = Prop.injective_on (~~) (* a)++------------------------------------------------------------------------------------+-- Properties of idempotent semigroups++-- | Idempotency property for additive semigroups.+--+-- @ 'idempotent_addition' = 'absorbative_addition' 'one' @+-- +-- See < https://en.wikipedia.org/wiki/Band_(mathematics) >.+--+-- This is a required property for lattices.+--+idempotent_addition_on :: (Additive-Semigroup) r => Rel r b -> r -> b+idempotent_addition_on (~~) r = (r + r) ~~ r++-- | Idempotency property for multplicative semigroups.+--+-- @ 'idempotent_multiplication' = 'absorbative_multiplication' 'zero' @+-- +-- See < https://en.wikipedia.org/wiki/Band_(mathematics) >.+--+-- This is a an /optional/ property for semigroups, and a /optional/ property for semirings.+--+-- This is a /required/ property for lattices.+--+idempotent_multiplication_on :: (Multiplicative-Semigroup) r => Rel r b -> r -> b+idempotent_multiplication_on (~~) r = (r * r) ~~ r++------------------------------------------------------------------------------------ -- Properties of semigroup morphisms +morphism_additive_on :: (Additive-Semigroup) r => (Additive-Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b+morphism_additive_on (~~) f x y = (f $ x + y) ~~ (f x + f y)++morphism_multiplicative_on :: (Multiplicative-Semigroup) r => (Multiplicative-Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b+morphism_multiplicative_on (~~) f x y = (f $ x * y) ~~ (f x * f y)++morphism_additive_on' :: (Additive-Monoid) r => (Additive-Monoid) s => Rel s b -> (r -> s) -> b+morphism_additive_on' (~~) f = (f zero) ~~ zero++morphism_multiplicative_on' :: (Multiplicative-Monoid) r => (Multiplicative-Monoid) s => Rel s b -> (r -> s) -> b+morphism_multiplicative_on' (~~) f = (f one) ~~ one+ {- morphism_additive_on :: (Additive-Semigroup) r => (Additive-Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b morphism_additive_on (~~) f x y = (f $ x `add` y) ~~ (f x `add` f y)@@ -115,16 +190,7 @@ morphism_multiplicative_on' :: (Multiplicative-Monoid) r => (Multiplicative-Monoid) s => Rel s b -> (r -> s) -> b morphism_multiplicative_on' (~~) f = (f one) ~~ one ---------------------------------------------------------------------------------------- Properties of commutative semigroups --- | \( \forall a, b \in R: a + b \sim b + a \)------ 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-commutative_addition_on (~~) = Prop.commutative_on (~~) add - -- | \( \forall a, b \in R: a * b \sim b * a \) -- -- This is a an /optional/ property for semigroups, and a /optional/ property for semirings.@@ -134,7 +200,6 @@ commutative_multiplication_on (~~) = Prop.commutative_on (~~) mul   -}---------------------------------------------------------------------------------------- Properties of idempotent dioids and predioids+  
src/Data/Semimodule.hs view
@@ -11,28 +11,43 @@ {-# LANGUAGE TypeOperators              #-} {-# LANGUAGE TypeFamilies               #-} -module Data.Semimodule where+module Data.Semimodule (+  -- * Types+    type Free+  , type Basis+  , type Basis2+  , type Basis3 +  , type FreeModule +  , type FreeSemimodule+  -- * Left modules+  , type LeftModule+  , LeftSemimodule(..)+  , lscaleDef+  , negateDef+  , lerp+  , (*.)+  , (/.)+  , (\.)+  -- * Right modules+  , type RightModule+  , RightSemimodule(..)+  , rscaleDef+  , (.*)+  , (./)+  , (.\)+  -- * Bimodules+  , type Bimodule+  , Bisemimodule(..)+) where -import safe Data.Bool import safe Data.Complex import safe Data.Semifield-import safe Data.Fixed-import safe Data.Functor.Compose import safe Data.Functor.Rep-import safe Data.Int import safe Data.Semiring-import safe Data.Semigroup.Foldable as Foldable1-import safe Data.Tuple-import safe Data.Word import safe GHC.Real hiding (Fractional(..)) import safe Numeric.Natural-import safe Foreign.C.Types (CFloat(..),CDouble(..)) import safe Prelude hiding (Num(..), Fractional(..), sum, product)-import safe qualified Prelude as N -import safe Data.Semigroup.Additive as A-import safe Data.Semigroup.Multiplicative as M- import safe Prelude (fromInteger)  @@ -40,74 +55,51 @@  type Basis b f = (Free f, Rep f ~ b) -{----- Semimodule over a semifield--- dioids-type DSpace r a = (Semifield r, Semimodule r a)----- | Free semimodule over a generating set.----type FreeSemimodule a f = (Free f, Semimodule a (f a))--type FreeModule a f = (Free f, Module a (f a))--type CommutativeGroup a = Module Integer a+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, Bimodule a a (f a)) ---instance (Unital (f a), Algebra (f a), Functor f) => Semifield (f a) where-  --recip q = conj' q // norm' q---  recip q = ((recip . norm' $ q) ><) <$> conj' q +type FreeSemimodule a f = (Free f, Bisemimodule a a (f a)) -type Module r a = (Ring r, Group a, Semimodule r a)+-------------------------------------------------------------------------------+-- Left modules+------------------------------------------------------------------------------- -infixl 7 .*, *.+type LeftModule l a = (Ring l, (Additive-Group) a, LeftSemimodule l a) --- | < https://en.wikipedia.org/wiki/Semimodule Semimodule > over a commutative semiring.+-- | < https://en.wikipedia.org/wiki/Semimodule Left semimodule > over a commutative semiring. -- -- All instances must satisfy the following identities: -- --- @ r '*.' (x '<>' y) '==' r '*.' x '<>' r '*.' y @------ @ (r '+' s) '*.' x '==' r '*.' x '<>' s '*.' x @------ @ (r '*' s) '*.' x '==' r '*.' (s '*.' x) @------ When the ring of coefficients /r/ is unital we must additionally have:------ @ 'one' '*.' x '==' x @+-- @+-- '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 r, Semigroup a) => Semimodule r a where+class (Semiring l, (Additive-Monoid) a) => LeftSemimodule l a where   -- | Left-multiply by a scalar.   ---  (*.) :: r -> a -> a-  (*.) = flip (.*)-  -  -- | Right-multiply by a scalar.-  ---  (.*) :: a -> r -> a-  (.*) = flip (*.)------ | Default definition of '(*.)' for a free module.----multl :: Semiring a => Functor f => a -> f a -> f a-multl a f = (a *) <$> f+  lscale :: l -> a -> a --- | Default definition of '(.*)' for a free module.+-- | Default definition of 'lscale' for a free module. ---multr :: Semiring a => Functor f => f a -> a -> f a-multr f a = (* a) <$> f+lscaleDef :: Semiring a => Functor f => a -> f a -> f a+lscaleDef a f = (a *) <$> f  -- | Default definition of '<<' for a commutative group. ---negateDef :: Semimodule Integer a => a -> a+negateDef :: LeftModule Integer a => a -> a negateDef a = (-1 :: Integer) *. a  -- | Linearly interpolate between two vectors.@@ -118,107 +110,178 @@ -- >>> lerp r u v -- V3 (6 % 4) (12 % 4) (18 % 4) ---lerp :: Module r a => r -> a -> a -> a-lerp r f g = r *. f <> (one - r) *. g+lerp :: LeftModule r a => r -> a -> a -> a+lerp r f g = r *. f + (one - r) *. g {-# INLINE lerp #-} -infix 6 .*.+infixr 7 *., \., /.  --- | Dot product.------ >>> V3 1 2 3 .*. V3 1 2 3--- 14--- -(.*.) :: Free f => Foldable f => Semiring a => f a -> f a -> a-(.*.) x y = sum $ liftR2 (*) x y-{-# INLINE (.*.) #-}+(*.) :: LeftSemimodule l a => l -> a -> a+(*.) = lscale --- | Squared /l2/ norm of a vector.----quadrance :: Free f => Foldable f => Semiring a => f a -> a-quadrance f = f .*. f-{-# INLINE quadrance #-}+(/.) :: Semifield a => Functor f => a -> f a -> f a+a /. f = (a /) <$> f --- | Squared /l2/ norm of the difference between two vectors.----qd :: Free f => Foldable f => Module a (f a) => f a -> f a -> a-qd f g = quadrance $ f << g-{-# INLINE qd #-}+(\.) :: Semifield a => Functor f => a -> f a -> f a+a \. f = (a \\) <$> f --- | Dirac delta function.++-------------------------------------------------------------------------------+-- Right modules+-------------------------------------------------------------------------------++type RightModule r a = (Ring r, (Additive-Group) a, RightSemimodule r a)++-- | < https://en.wikipedia.org/wiki/Semimodule Right semimodule > over a commutative semiring. ---dirac :: Eq i => Semiring a => i -> i -> a-dirac i j = bool zero one (i == j)-{-# INLINE dirac #-}+-- 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 where --- | Create a unit vector at an index.+  -- | Right-multiply by a scalar.+  --+  rscale :: r -> a -> a++-- | Default definition of 'rscale' for a free module. ----- >>> idx I21 :: V2 Int--- V2 1 0+rscaleDef :: Semiring a => Functor f => a -> f a -> f a+rscaleDef a f = (* a) <$> f++infixl 7 .*, .\, ./ +(.*) :: RightSemimodule r a => a -> r -> a+(.*) = flip rscale++(./) :: Semifield a => Functor f => f a -> a -> f a+(./) = flip (/.)++(.\) :: Semifield a => Functor f => f a -> a -> f a+(.\) = flip (\.)++-------------------------------------------------------------------------------+-- Bimodules+-------------------------------------------------------------------------------++type Bimodule l r a = (LeftModule l a, RightModule r a, Bisemimodule l r a)++-- | < https://en.wikipedia.org/wiki/Bimodule Bisemimodule > over a commutative semiring. ----- >>> idx I42 :: V4 Int--- V4 0 1 0 0+-- @+-- 'lscale' l . 'rscale' r = 'rscale' r . 'lscale' l+-- @ ---idx :: Free f => Semiring a => Rep f -> f a-idx i = tabulate $ dirac i-{-# INLINE idx #-}+class (LeftSemimodule l a, RightSemimodule r a) => Bisemimodule l r a where +  discale :: l -> r -> a -> a+  discale l r = lscale l . rscale r+ ------------------------------------------------------------------------------- -- Instances ------------------------------------------------------------------------------- -instance Semiring r => Semimodule r () where -  _ *. _ = ()+instance Semiring l => LeftSemimodule l () where +  lscale _ = const () -instance Semigroup a => Semimodule () a where -  _ *. a = a+instance (Additive-Monoid) a => LeftSemimodule () a where +  lscale _ = id -instance Monoid a => Semimodule Natural a where-  (*.) = mreplicate+instance (Additive-Monoid) a => LeftSemimodule Natural a where+  lscale l a = unAdditive $ mreplicate l (Additive a) -instance Group a => Semimodule Integer a where-  (*.) = greplicate+instance ((Additive-Monoid) a, (Additive-Group) a) => LeftSemimodule Integer a where+  lscale l a = unAdditive $ greplicate l (Additive a) -instance Semimodule r a => Semimodule r (e -> a) where -  a *. f = (a *.) <$> f+instance LeftSemimodule l a => LeftSemimodule l (e -> a) where +  lscale l = fmap (l *.) -instance (Semimodule r a, Semimodule r b) => Semimodule r (a, b) where-  n *. (a, b) = (n *. a, n *. b)+instance (LeftSemimodule l a, LeftSemimodule l b) => LeftSemimodule l (a, b) where+  lscale n (a, b) = (n *. a, n *. b) -instance (Semimodule r a, Semimodule r b, Semimodule r c) => Semimodule r (a, b, c) where-  n *. (a, b, c) = (n *. a, n *. b, n *. c)+instance (LeftSemimodule l a, LeftSemimodule l b, LeftSemimodule l c) => LeftSemimodule l (a, b, c) where+  lscale n (a, b, c) = (n *. a, n *. b, n *. c) -instance (Semiring a, Semimodule r a) => Semimodule r (Additive (Ratio a)) where -  a *. (Additive (x :% y)) = Additive $ (a *. x) :% y+instance Semiring a => LeftSemimodule a (Ratio a) where +  lscale l (x :% y) = (l * x) :% y -instance (Ring a, Semimodule r a) => Semimodule r (Additive (Complex a)) where -  a *. (Additive (x :+ y)) = Additive $ (a *. x) :+ (a *. y)+instance Ring a => LeftSemimodule a (Complex a) where +  lscale l (x :+ y) = (l * x) :+ (l * y) -#define deriveSemimodule(ty)                                 \-instance Semiring ty => Semimodule ty (Additive ty) where {  \-   r *. (Additive a) = Additive $ r * a                                \-;  {-# INLINE (*.) #-}                                       \+instance Ring a => LeftSemimodule (Complex a) (Complex a) where +   lscale = (*)  ++{-+#define deriveLeftSemimodule(ty)                      \+instance LeftSemimodule ty ty where {                 \+   lscale = (*)                                       \+;  {-# INLINE lscale #-}                              \ } -deriveSemimodule(Bool)-deriveSemimodule(Int)-deriveSemimodule(Int8)-deriveSemimodule(Int16)-deriveSemimodule(Int32)-deriveSemimodule(Int64)-deriveSemimodule(Word)-deriveSemimodule(Word8)-deriveSemimodule(Word16)-deriveSemimodule(Word32)-deriveSemimodule(Word64)-deriveSemimodule(Uni)-deriveSemimodule(Deci)-deriveSemimodule(Centi)-deriveSemimodule(Milli)-deriveSemimodule(Micro)-deriveSemimodule(Nano)-deriveSemimodule(Pico)-deriveSemimodule(Float)-deriveSemimodule(Double)-deriveSemimodule(CFloat)-deriveSemimodule(CDouble)+deriveLeftSemimodule(Bool)+deriveLeftSemimodule(Int)+deriveLeftSemimodule(Int8)+deriveLeftSemimodule(Int16)+deriveLeftSemimodule(Int32)+deriveLeftSemimodule(Int64)+deriveLeftSemimodule(Word)+deriveLeftSemimodule(Word8)+deriveLeftSemimodule(Word16)+deriveLeftSemimodule(Word32)+deriveLeftSemimodule(Word64)+deriveLeftSemimodule(Uni)+deriveLeftSemimodule(Deci)+deriveLeftSemimodule(Centi)+deriveLeftSemimodule(Milli)+deriveLeftSemimodule(Micro)+deriveLeftSemimodule(Nano)+deriveLeftSemimodule(Pico)+deriveLeftSemimodule(Float)+deriveLeftSemimodule(Double)+deriveLeftSemimodule(CFloat)+deriveLeftSemimodule(CDouble)+-}++instance Semiring r => RightSemimodule r () where +  rscale _ = const ()++instance (Additive-Monoid) a => RightSemimodule () a where +  rscale _ = id++instance (Additive-Monoid) a => RightSemimodule Natural a where+  rscale r a = unAdditive $ mreplicate r (Additive a)++instance ((Additive-Monoid) a, (Additive-Group) a) => RightSemimodule Integer a where+  rscale r a = unAdditive $ greplicate r (Additive a)++instance RightSemimodule r a => RightSemimodule r (e -> a) where +  rscale r = fmap (.* r)++instance (RightSemimodule r a, RightSemimodule r b) => RightSemimodule r (a, b) where+  rscale n (a, b) = (a .* n, b .* n)++instance (RightSemimodule r a, RightSemimodule r b, RightSemimodule r c) => RightSemimodule r (a, b, c) where+  rscale n (a, b, c) = (a .* n, b .* n, c .* n)++instance Semiring a => RightSemimodule a (Ratio a) where +  rscale r (x :% y) = (r * x) :% y++instance Ring a => RightSemimodule a (Complex a) where +  rscale r (x :+ y) = (r * x) :+ (r * y)++instance Ring a => RightSemimodule (Complex a) (Complex a) where +  rscale = (*) ++instance Semiring r => Bisemimodule r r ()++instance Bisemimodule r r a => Bisemimodule r r (e -> a)++instance (Bisemimodule r r a, Bisemimodule r r b) => Bisemimodule r r (a, b)++instance (Bisemimodule r r a, Bisemimodule r r b, Bisemimodule r r c) => Bisemimodule r r (a, b, c)++instance Semiring a => Bisemimodule a a (Ratio a)++instance Ring a => Bisemimodule a a (Complex a)++instance Ring a => Bisemimodule (Complex a) (Complex a) (Complex a)+
+ src/Data/Semimodule/Basis.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE Safe                       #-}+{-# LANGUAGE RankNTypes                 #-}+{-# LANGUAGE TypeFamilies                 #-}+module Data.Semimodule.Basis (+  -- * Euclidean bases+    E1(..), e1, fillE1+  , E2(..), e2, fillE2+  , E3(..), e3, fillE3+  , E4(..), e4, fillE4+  , E6(..)+) where++import safe Data.Functor.Rep+import safe Data.Semimodule+import safe Prelude hiding (Num(..), Fractional(..), negate, sum, product)++++-------------------------------------------------------------------------------+-- Standard basis on one real dimension+-------------------------------------------------------------------------------++data E1 = E1 deriving (Eq, Ord, Show)++e1 :: a -> E1 -> a+e1 = const++fillE1 :: Basis E1 f => a -> f a+fillE1 x = tabulate $ e1 x++-------------------------------------------------------------------------------+-- Standard basis on two real dimensions+-------------------------------------------------------------------------------++data E2 = E21 | E22 deriving (Eq, Ord, Show)++e2 :: a -> a -> E2 -> a+e2 x _ E21 = x+e2 _ y E22 = y++fillE2 :: Basis E2 f => a -> a -> f a+fillE2 x y = tabulate $ e2 x y++-------------------------------------------------------------------------------+-- Standard basis on three real dimensions +-------------------------------------------------------------------------------++data E3 = E31 | E32 | E33 deriving (Eq, Ord, Show)++e3 :: a -> a -> a -> E3 -> a+e3 x _ _ E31 = x+e3 _ y _ E32 = y+e3 _ _ z E33 = z++fillE3 :: Basis E3 f => a -> a -> a -> f a+fillE3 x y z = tabulate $ e3 x y z++-------------------------------------------------------------------------------+-- Standard basis on four real dimensions+-------------------------------------------------------------------------------++data E4 = E41 | E42 | E43 | E44 deriving (Eq, Ord, Show)++e4 :: a -> a -> a -> a -> E4 -> a+e4 x _ _ _ E41 = x+e4 _ y _ _ E42 = y+e4 _ _ z _ E43 = z+e4 _ _ _ w E44 = w++fillE4 :: Basis E4 f => a -> a -> a -> a -> f a+fillE4 x y z w = tabulate $ e4 x y z w++-------------------------------------------------------------------------------+-- Standard basis on five real dimensions+-------------------------------------------------------------------------------++data E5 = E51 | E52 | E53 | E54 | E55 deriving (Eq, Ord, Show)++-------------------------------------------------------------------------------+-- Standard basis on six real dimensions+-------------------------------------------------------------------------------++data E6 = E61 | E62 | E63 | E64 | E65 | E66 deriving (Eq, Ord, Show)
+ src/Data/Semimodule/Free.hs view
@@ -0,0 +1,1389 @@+{-# LANGUAGE CPP                        #-}+{-# LANGUAGE Safe                       #-}+{-# LANGUAGE PolyKinds                  #-}+{-# LANGUAGE ConstraintKinds            #-}+{-# LANGUAGE DefaultSignatures          #-}+{-# LANGUAGE DeriveFunctor              #-}+{-# LANGUAGE DeriveGeneric              #-}+{-# LANGUAGE FlexibleContexts           #-}+{-# LANGUAGE FlexibleInstances          #-}+{-# LANGUAGE NoImplicitPrelude          #-}+{-# LANGUAGE RebindableSyntax           #-}+{-# LANGUAGE TypeOperators              #-}+{-# LANGUAGE TypeFamilies               #-}+{-# LANGUAGE RankNTypes               #-}++module Data.Semimodule.Free (+  -- * Types+    type Free+  , type Basis+  , type Basis2+  , type Basis3+  -- * Vector arithmetic+  , (.*)+  , (.#)+  , (*.)+  , (#.)+  , dot+  , lerp+  , quadrance+  , qd+  , cross+  , triple+  -- * Vector accessors and constructors+  , dirac+  , idx+  , elt+  , lensRep+  , grateRep+  -- * Matrix arithmetic+  , (.#.)+  , trace+  , transpose+  , inv1+  , inv2+  , bdet2+  , det2+  , bdet3+  , det3+  , inv3+  , bdet4+  , det4+  , inv4+  -- * Matrix accessors and constructors+  , tran+  , elt2+  , row+  , rows+  , col+  , cols+  , diag+  , outer+  , identity+  , diagonal+  -- * Vector types+  , V1(..)+  , unV1+  , V2(..)+  , V3(..)+  , V4(..)+  -- * Matrix types+  , type M11+  , type M12+  , type M13+  , type M14+  , type M21+  , type M31+  , type M41+  , type M22+  , type M23+  , type M24+  , type M32+  , type M33+  , type M34+  , type M42+  , type M43+  , type M44+  , m11+  , m12+  , m13+  , m14+  , m21+  , m31+  , m41+  , m22+  , m23+  , m24+  , m32+  , m33+  , m34+  , m42+  , m43+  , m44+) where++import safe Control.Applicative+import safe Data.Bool+import safe Data.Distributive+import safe Data.Functor.Classes+import safe Data.Functor.Compose+import safe Data.Functor.Rep+import safe Data.Semifield+import safe Data.Semigroup.Foldable as Foldable1+import safe Data.Semimodule+import safe Data.Semimodule.Basis+import safe Data.Semimodule.Transform+import safe Data.Semiring+import safe Prelude hiding (Num(..), Fractional(..), negate, sum, product)+import safe Prelude (fromInteger)++-------------------------------------------------------------------------------+-- Vector Arithmetic+-------------------------------------------------------------------------------+++infix 7 #., .#++-- | Multiply a matrix on the left by a row vector.+--+-- >>> V2 1 2 #. m23 3 4 5 6 7 8+-- V3 15 18 21+--+-- >>> (V2 1 2 #. m23 3 4 5 6 7 8) #. m32 1 0 0 0 0 0+-- V2 15 0+--+(#.) :: Semiring a => Foldable f => Basis2 b c f g => f a -> (f**g) a -> g a+x #. y = tabulate (\j -> x `dot` col j y)+{-# INLINE (#.) #-}++-- | Multiply a matrix on the right by a column vector.+--+-- @ ('.#') = 'app' . 'tran' @+--+-- >>> app (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 50 0+--+(.#) :: Semiring a => Foldable g => Basis2 b c f g => (f**g) a -> g a -> f a+x .# y = tabulate (\i -> row i x `dot` y)+{-# INLINE (.#) #-}+++infix 6 `dot`++-- | Dot product.+--+-- This is a variant of 'Data.Semiring.xmult' restricted to free functors.+--+-- >>> V3 1 2 3 `dot` V3 1 2 3+-- 14+-- +dot :: Semiring a => Foldable f => Basis b f => f a -> f a -> a+dot x y = sum $ liftR2 (*) x y+{-# INLINE dot #-}++-- | Squared /l2/ norm of a vector.+--+quadrance :: Semiring a => Foldable f => Basis b f => f a -> a+quadrance x = x `dot` x+{-# INLINE quadrance #-}++-- | Squared /l2/ norm of the difference between two vectors.+--+qd :: FreeModule a f => Foldable f => f a -> f a -> a+qd x y = quadrance $ x - y+{-# INLINE qd #-}++-- | 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 < https://en.wikipedia.org/wiki/Jacobi_identity Jacobi identity >.+--+cross :: Ring a => V3 a -> V3 a -> V3 a+cross (V3 a b c) (V3 d e f) = V3 (b*f-c*e) (c*d-a*f) (a*e-b*d)+{-# INLINABLE cross #-}++-- | 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+triple x y z = dot x (cross y z)+{-# INLINE triple #-}++-------------------------------------------------------------------------------+-- Vector Constructors & Acessors+-------------------------------------------------------------------------------++-- | Dirac delta function.+--+dirac :: Eq i => Semiring a => i -> i -> a+dirac i j = bool zero one (i == j)+{-# INLINE dirac #-}++-- | 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+idx i = tabulate $ dirac i+{-# INLINE idx #-}++-- | Retrieve an element of a vector.+--+-- >>> elt E21 (V2 1 2)+-- 1+--+elt :: Basis b f => b -> f a -> a+elt = flip index+{-# INLINE elt #-}++lensRep :: Basis b f => b -> forall g. Functor g => (a -> g a) -> f a -> (g**f) a +lensRep i f s = Compose $ setter s <$> f (getter s)+  where getter = flip index i+        setter s' b = tabulate $ \j -> bool (index s' j) b (i == j)+{-# INLINE lensRep #-}++grateRep :: Basis b f => forall g. Functor g => (b -> g a1 -> a2) -> (g**f) a1 -> f a2+grateRep iab s = tabulate $ \i -> iab i (fmap (`index` i) $ getCompose s)+{-# INLINE grateRep #-}++-------------------------------------------------------------------------------+-- Matrix Arithmetic+-------------------------------------------------------------------------------++infixr 7 .#.++-- | 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))+--+(.#.) :: Semiring a => Foldable g => Basis3 b c d f g h => (f**g) a -> (g**h) a -> (f**h) a+(.#.) x y = tabulate (\(i,j) -> row i x `dot` col j y)+{-# INLINE (.#.) #-}++-- | Compute the trace of a matrix.+--+-- >>> trace $ m22 1.0 2.0 3.0 4.0+-- 5.0+--+trace :: Semiring a => Foldable f => Basis b f => (f**f) a -> a+trace = sum . diagonal+{-# INLINE trace #-}++-- | 1x1 matrix inverse over a field.+--+-- >>> inv1 $ m11 4.0 :: M11 Double+-- Compose (V1 (V1 0.25))+--+inv1 :: Field a => M11 a -> M11 a+inv1 = transpose . fmap recip++-- | 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)+bdet2 m = (elt2 E21 E21 m * elt2 E22 E22 m, elt2 E21 E22 m * elt2 E22 E21 m)+{-# INLINE bdet2 #-}++-- | 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+det2 = uncurry (-) . bdet2 +{-# INLINE det2 #-}++-- | 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+inv2 m = lscaleDef (recip $ det2 m) $ m22 d (-b) (-c) a where+  a = elt2 E21 E21 m+  b = elt2 E21 E22 m+  c = elt2 E22 E21 m+  d = elt2 E22 E22 m+{-# INLINE inv2 #-}++-- | 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)+bdet3 m = (evens, odds) where+  evens = a*e*i + g*b*f + d*h*c+  odds  = a*h*f + d*b*i + g*e*c+  a = elt2 E31 E31 m+  b = elt2 E31 E32 m+  c = elt2 E31 E33 m+  d = elt2 E32 E31 m+  e = elt2 E32 E32 m+  f = elt2 E32 E33 m+  g = elt2 E33 E31 m+  h = elt2 E33 E32 m+  i = elt2 E33 E33 m+{-# INLINE bdet3 #-}++-- | 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+det3 m = a * (e*i-f*h) - d * (b*i-c*h) + g * (b*f-c*e) where+  a = elt2 E31 E31 m+  b = elt2 E31 E32 m+  c = elt2 E31 E33 m+  d = elt2 E32 E31 m+  e = elt2 E32 E32 m+  f = elt2 E32 E33 m+  g = elt2 E33 E31 m+  h = elt2 E33 E32 m+  i = elt2 E33 E33 m+{-# INLINE det3 #-}++-- | 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+inv3 m = lscaleDef (recip $ det3 m) $ m33 a' b' c' d' e' f' g' h' i' where+  a = elt2 E31 E31 m+  b = elt2 E31 E32 m+  c = elt2 E31 E33 m+  d = elt2 E32 E31 m+  e = elt2 E32 E32 m+  f = elt2 E32 E33 m+  g = elt2 E33 E31 m+  h = elt2 E33 E32 m+  i = elt2 E33 E33 m+  a' = cofactor (e,f,h,i)+  b' = cofactor (c,b,i,h)+  c' = cofactor (b,c,e,f)+  d' = cofactor (f,d,i,g)+  e' = cofactor (a,c,g,i)+  f' = cofactor (c,a,f,d)+  g' = cofactor (d,e,g,h)+  h' = cofactor (b,a,h,g)+  i' = cofactor (a,b,d,e)+  cofactor (q,r,s,t) = det2 (m22 q r s t)+{-# INLINE inv3 #-}++-- | 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) +bdet4 x = (evens, odds) where+  evens = a * (f*k*p + g*l*n + h*j*o) ++          b * (g*i*p + e*l*o + h*k*m) ++          c * (e*j*p + f*l*m + h*i*n) ++          d * (f*i*o + e*k*n + g*j*m)+  odds =  a * (g*j*p + f*l*o + h*k*n) ++          b * (e*k*p + g*l*m + h*i*o) ++          c * (f*i*p + e*l*n + h*j*m) ++          d * (e*j*o + f*k*m + g*i*n)+  a = elt2 E41 E41 x+  b = elt2 E41 E42 x+  c = elt2 E41 E43 x+  d = elt2 E41 E44 x+  e = elt2 E42 E41 x+  f = elt2 E42 E42 x+  g = elt2 E42 E43 x+  h = elt2 E42 E44 x+  i = elt2 E43 E41 x+  j = elt2 E43 E42 x+  k = elt2 E43 E43 x+  l = elt2 E43 E44 x+  m = elt2 E44 E41 x+  n = elt2 E44 E42 x+  o = elt2 E44 E43 x+  p = elt2 E44 E44 x+{-# INLINE bdet4 #-}++-- | 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+det4 x = s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0 where+  s0 = i00 * e11 - e10 * i01+  s1 = i00 * e12 - e10 * i02+  s2 = i00 * e13 - e10 * i03+  s3 = i01 * e12 - e11 * i02+  s4 = i01 * e13 - e11 * i03+  s5 = i02 * e13 - e12 * i03++  c5 = e22 * e33 - e32 * e23+  c4 = e21 * e33 - e31 * e23+  c3 = e21 * e32 - e31 * e22+  c2 = e20 * e33 - e30 * e23+  c1 = e20 * e32 - e30 * e22+  c0 = e20 * e31 - e30 * e21++  i00 = elt2 E41 E41 x+  i01 = elt2 E41 E42 x+  i02 = elt2 E41 E43 x+  i03 = elt2 E41 E44 x+  e10 = elt2 E42 E41 x+  e11 = elt2 E42 E42 x+  e12 = elt2 E42 E43 x+  e13 = elt2 E42 E44 x+  e20 = elt2 E43 E41 x+  e21 = elt2 E43 E42 x+  e22 = elt2 E43 E43 x+  e23 = elt2 E43 E44 x+  e30 = elt2 E44 E41 x+  e31 = elt2 E44 E42 x+  e32 = elt2 E44 E43 x+  e33 = elt2 E44 E44 x+{-# INLINE det4 #-}++-- | 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+inv4 x = lscaleDef (recip det) $ x' where+  i00 = elt2 E41 E41 x+  i01 = elt2 E41 E42 x+  i02 = elt2 E41 E43 x+  i03 = elt2 E41 E44 x+  e10 = elt2 E42 E41 x+  e11 = elt2 E42 E42 x+  e12 = elt2 E42 E43 x+  e13 = elt2 E42 E44 x+  e20 = elt2 E43 E41 x+  e21 = elt2 E43 E42 x+  e22 = elt2 E43 E43 x+  e23 = elt2 E43 E44 x+  e30 = elt2 E44 E41 x+  e31 = elt2 E44 E42 x+  e32 = elt2 E44 E43 x+  e33 = elt2 E44 E44 x++  s0 = i00 * e11 - e10 * i01+  s1 = i00 * e12 - e10 * i02+  s2 = i00 * e13 - e10 * i03+  s3 = i01 * e12 - e11 * i02+  s4 = i01 * e13 - e11 * i03+  s5 = i02 * e13 - e12 * i03+  c5 = e22 * e33 - e32 * e23+  c4 = e21 * e33 - e31 * e23+  c3 = e21 * e32 - e31 * e22+  c2 = e20 * e33 - e30 * e23+  c1 = e20 * e32 - e30 * e22+  c0 = e20 * e31 - e30 * e21++  det = s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0++  x' = m44 (e11 * c5 - e12 * c4 + e13 * c3)+           (-i01 * c5 + i02 * c4 - i03 * c3)+           (e31 * s5 - e32 * s4 + e33 * s3)+           (-e21 * s5 + e22 * s4 - e23 * s3)+           (-e10 * c5 + e12 * c2 - e13 * c1)+           (i00 * c5 - i02 * c2 + i03 * c1)+           (-e30 * s5 + e32 * s2 - e33 * s1)+           (e20 * s5 - e22 * s2 + e23 * s1)+           (e10 * c4 - e11 * c2 + e13 * c0)+           (-i00 * c4 + i01 * c2 - i03 * c0)+           (e30 * s4 - e31 * s2 + e33 * s0)+           (-e20 * s4 + e21 * s2 - e23 * s0)+           (-e10 * c3 + e11 * c1 - e12 * c0)+           (i00 * c3 - i01 * c1 + i02 * c0)+           (-e30 * s3 + e31 * s1 - e32 * s0)+           (e20 * s3 - e21 * s1 + e22 * s0)+{-# INLINE inv4 #-}++-------------------------------------------------------------------------------+-- Matrix constructors and accessors+-------------------------------------------------------------------------------++-- | Lift a matrix into a linear transformation+--+-- @ ('.#') = 'app' . 'tran' @+--+tran :: Semiring a => Basis2 b c f g => Foldable g => (f**g) a -> Tran a b c+tran m = Tran $ \f -> index $ m .# (tabulate f)++-- | 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+elt2 i j = elt i . col j+{-# INLINE elt2 #-}++-- | Retrieve a row of a matrix.+--+-- >>> row E22 $ m23 1 2 3 4 5 6+-- V3 4 5 6+--+row :: Basis b f => b -> (f**g) a -> g a+row i = elt i . getCompose+{-# INLINE row #-}++-- | Retrieve a column of a matrix.+--+-- >>> elt E22 . col E31 $ m23 1 2 3 4 5 6+-- 4+--+col :: Basis2 b c f g => c -> (f**g) a -> f a+col j = elt j . distribute . getCompose+{-# INLINE col #-}++-- | Obtain a diagonal matrix from a vector.+--+-- >>> diag $ V2 2 3+-- Compose (V2 (V2 2 0) (V2 0 3))+--+diag :: Semiring a => Basis b f => f a -> (f**f) a+diag f = Compose $ flip imapRep f $ \i x -> flip imapRep f (\j _ -> bool zero x $ i == j)+{-# INLINE diag #-}++-- | Outer product of two vectors.+--+-- >>> V2 1 1 `outer` V2 1 1+-- Compose (V2 (V2 1 1) (V2 1 1))+--+outer :: Semiring a => Basis2 b c f g => f a -> g a -> (f**g) a+outer x y = Compose $ fmap (\z-> fmap (*z) y) x++-- | Identity matrix.+--+-- >>> identity :: M33 Int+-- Compose (V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1))+--+identity :: Semiring a => Basis b f => (f**f) a+identity = diag $ pureRep one+{-# INLINE identity #-}++-- | Obtain the diagonal of a matrix as a vector.+--+-- >>> diagonal $ m22 1.0 2.0 3.0 4.0+-- V2 1.0 4.0+--+diagonal :: Representable f => (f**f) a -> f a+diagonal = flip bindRep id . getCompose+{-# INLINE diagonal #-}++-- | Construct a 1x1 matrix.+--+-- >>> m11 1 :: M11 Int+-- Compose (V1 (V1 1))+--+m11 :: a -> M11 a+m11 a = Compose $ V1 (V1 a)+{-# INLINE m11 #-}++-- | Construct a 1x2 matrix.+--+-- >>> m12 1 2 :: M12 Int+-- Compose (V1 (V2 1 2))+--+m12 :: a -> a -> M12 a+m12 a b = Compose $ V1 (V2 a b)+{-# INLINE m12 #-}++-- | Construct a 1x3 matrix.+--+-- >>> m13 1 2 3 :: M13 Int+-- Compose (V1 (V3 1 2 3))+--+m13 :: a -> a -> a -> M13 a+m13 a b c = Compose $ V1 (V3 a b c)+{-# INLINE m13 #-}++-- | 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+m14 a b c d = Compose $ V1 (V4 a b c d)+{-# INLINE m14 #-}++-- | Construct a 2x1 matrix.+--+-- >>> m21 1 2 :: M21 Int+-- Compose (V2 (V1 1) (V1 2))+--+m21 :: a -> a -> M21 a+m21 a b = Compose $ V2 (V1 a) (V1 b)+{-# INLINE m21 #-}++-- | Construct a 3x1 matrix.+--+-- >>> m31 1 2 3 :: M31 Int+-- Compose (V3 (V1 1) (V1 2) (V1 3))+--+m31 :: a -> a -> a -> M31 a+m31 a b c = Compose $ V3 (V1 a) (V1 b) (V1 c)+{-# INLINE m31 #-}++-- | 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+m41 a b c d = Compose $ V4 (V1 a) (V1 b) (V1 c) (V1 d)+{-# INLINE m41 #-}++-- | 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+m22 a b c d = Compose $ V2 (V2 a b) (V2 c d)+{-# INLINE m22 #-}++-- | Construct a 2x3 matrix.+--+-- Arguments are in row-major order.+--+m23 :: a -> a -> a -> a -> a -> a -> M23 a+m23 a b c d e f = Compose $ V2 (V3 a b c) (V3 d e f)+{-# INLINE m23 #-}++-- | Construct a 2x4 matrix.+--+-- Arguments are in row-major order.+--+m24 :: a -> a -> a -> a -> a -> a -> a -> a -> M24 a+m24 a b c d e f g h = Compose $ V2 (V4 a b c d) (V4 e f g h)+{-# INLINE m24 #-}++-- | Construct a 3x2 matrix.+--+-- Arguments are in row-major order.+--+m32 :: a -> a -> a -> a -> a -> a -> M32 a+m32 a b c d e f = Compose $ V3 (V2 a b) (V2 c d) (V2 e f)+{-# INLINE m32 #-}++-- | Construct a 3x3 matrix.+--+-- Arguments are in row-major order.+--+m33 :: a -> a -> a -> a -> a -> a -> a -> a -> a -> M33 a+m33 a b c d e f g h i = Compose $ V3 (V3 a b c) (V3 d e f) (V3 g h i)+{-# INLINE m33 #-}++-- | 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+m34 a b c d e f g h i j k l = Compose $ V3 (V4 a b c d) (V4 e f g h) (V4 i j k l)+{-# INLINE m34 #-}++-- | Construct a 4x2 matrix.+--+-- Arguments are in row-major order.+--+m42 :: a -> a -> a -> a -> a -> a -> a -> a -> M42 a+m42 a b c d e f g h = Compose $ V4 (V2 a b) (V2 c d) (V2 e f) (V2 g h)+{-# INLINE m42 #-}++-- | 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+m43 a b c d e f g h i j k l = Compose $ V4 (V3 a b c) (V3 d e f) (V3 g h i) (V3 j k l)+{-# INLINE m43 #-}++-- | 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+m44 a b c d e f g h i j k l m n o p = Compose $ V4 (V4 a b c d) (V4 e f g h) (V4 i j k l) (V4 m n o p)+{-# INLINE m44 #-}++-------------------------------------------------------------------------------+-- Matrix types+-------------------------------------------------------------------------------++-- All matrices use row-major representation.++-- | 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++++-------------------------------------------------------------------------------+-- V1+-------------------------------------------------------------------------------++unV1 :: V1 a -> a+unV1 (V1 a) = a++newtype V1 a = V1 a deriving (Eq,Ord,Show)++instance Show1 V1 where+  liftShowsPrec f _ d (V1 a) = showParen (d >= 10) $ showString "V1 " . f d a++{-+instance Field a => Composition a V1 where+  conj = id++  norm f = unV1 $ liftA2 (*) f f+-}++instance Functor V1 where+  fmap f (V1 a) = V1 (f a)+  {-# INLINE fmap #-}+  a <$ _ = V1 a+  {-# INLINE (<$) #-}++instance Applicative V1 where+  pure = pureRep+  liftA2 = liftR2++instance Foldable V1 where+  foldMap f (V1 a) = f a+  {-# INLINE foldMap #-}+  null _ = False+  length _ = one++instance Foldable1 V1 where+  foldMap1 f (V1 a) = f a+  {-# INLINE foldMap1 #-}++instance Distributive V1 where+  distribute f = V1 $ fmap (\(V1 x) -> x) f+  {-# INLINE distribute #-}++instance Representable V1 where+  type Rep V1 = E1+  tabulate f = V1 (f E1)+  {-# INLINE tabulate #-}++  index (V1 x) E1 = x+  {-# INLINE index #-}++-------------------------------------------------------------------------------+-- V2+-------------------------------------------------------------------------------++data V2 a = V2 !a !a deriving (Eq,Ord,Show)++instance Show1 V2 where+  liftShowsPrec f _ d (V2 a b) = showsBinaryWith f f "V2" d a b++instance Functor V2 where+  fmap f (V2 a b) = V2 (f a) (f b)+  {-# INLINE fmap #-}+  a <$ _ = V2 a a+  {-# INLINE (<$) #-}++instance Applicative V2 where+  pure = pureRep+  liftA2 = liftR2++instance Foldable V2 where+  foldMap f (V2 a b) = f a <> f b+  {-# INLINE foldMap #-}+  null _ = False+  length _ = two++instance Foldable1 V2 where+  foldMap1 f (V2 a b) = f a <> f b+  {-# INLINE foldMap1 #-}++instance Distributive V2 where+  distribute f = V2 (fmap (\(V2 x _) -> x) f) (fmap (\(V2 _ y) -> y) f)+  {-# INLINE distribute #-}++instance Representable V2 where+  type Rep V2 = E2+  tabulate f = V2 (f E21) (f E22)+  {-# INLINE tabulate #-}++  index (V2 x _) E21 = x+  index (V2 _ y) E22 = y+  {-# INLINE index #-}++-------------------------------------------------------------------------------+-- V3+-------------------------------------------------------------------------------+++data V3 a = V3 !a !a !a deriving (Eq,Ord,Show)++-- TODO add Prd1 and push instance downstream+instance Eq1 V3 where+  liftEq k (V3 a b c) (V3 d e f) = k a d && k b e && k c f++instance Show1 V3 where+  liftShowsPrec f _ d (V3 a b c) = showParen (d > 10) $+     showString "V3 " . f 11 a . showChar ' ' . f 11 b . showChar ' ' . f 11 c++instance Functor V3 where+  fmap f (V3 a b c) = V3 (f a) (f b) (f c)+  {-# INLINE fmap #-}+  a <$ _ = V3 a a a+  {-# INLINE (<$) #-}++instance Applicative V3 where+  pure = pureRep+  liftA2 = liftR2++instance Foldable V3 where+  foldMap f (V3 a b c) = f a <> f b <> f c+  {-# INLINE foldMap #-}+  null _ = False+  --length _ = 3++instance Foldable1 V3 where+  foldMap1 f (V3 a b c) = f a <> f b <> f c+  {-# INLINE foldMap1 #-}++instance Distributive V3 where+  distribute f = V3 (fmap (\(V3 x _ _) -> x) f) (fmap (\(V3 _ y _) -> y) f) (fmap (\(V3 _ _ z) -> z) f)+  {-# INLINE distribute #-}++instance Representable V3 where+  type Rep V3 = E3+  tabulate f = V3 (f E31) (f E32) (f E33)+  {-# INLINE tabulate #-}++  index (V3 x _ _) E31 = x+  index (V3 _ y _) E32 = y+  index (V3 _ _ z) E33 = z+  {-# INLINE index #-}++++-------------------------------------------------------------------------------+-- V4+-------------------------------------------------------------------------------++data V4 a = V4 !a !a !a !a deriving (Eq,Ord,Show)++instance Show1 V4 where+  liftShowsPrec f _ z (V4 a b c d) = showParen (z > 10) $+     showString "V4 " . f 11 a . showChar ' ' . f 11 b . showChar ' ' . f 11 c . showChar ' ' . f 11 d++instance Functor V4 where+  fmap f (V4 a b c d) = V4 (f a) (f b) (f c) (f d)+  {-# INLINE fmap #-}+  a <$ _ = V4 a a a a+  {-# INLINE (<$) #-}++instance Applicative V4 where+  pure = pureRep+  liftA2 = liftR2++instance Foldable V4 where+  foldMap f (V4 a b c d) = f a <> f b <> f c <> f d+  {-# INLINE foldMap #-}+  null _ = False+  length _ = two + two++instance Foldable1 V4 where+  foldMap1 f (V4 a b c d) = f a <> f b <> f c <> f d+  {-# INLINE foldMap1 #-}++instance Distributive V4 where+  distribute f = V4 (fmap (\(V4 x _ _ _) -> x) f) (fmap (\(V4 _ y _ _) -> y) f) (fmap (\(V4 _ _ z _) -> z) f) (fmap (\(V4 _ _ _ w) -> w) f)+  {-# INLINE distribute #-}++instance Representable V4 where+  type Rep V4 = E4+  tabulate f = V4 (f E41) (f E42) (f E43) (f E44)+  {-# INLINE tabulate #-}++  index (V4 x _ _ _) E41 = x+  index (V4 _ y _ _) E42 = y+  index (V4 _ _ z _) E43 = z+  index (V4 _ _ _ w) E44 = w+  {-# INLINE index #-}+++-------------------------------------------------------------------------------+-- Autogenerated instances+-------------------------------------------------------------------------------+++#define deriveAdditiveSemigroup(ty)                                    \+instance (Additive-Semigroup) a => Semigroup (Additive (ty a)) where { \+   (<>) = liftA2 $ mzipWithRep (+)                                     \+;  {-# INLINE (<>) #-}                                                 \+}++#define deriveAdditiveMonoid(ty)                                 \+instance (Additive-Monoid) a => Monoid (Additive (ty a)) where { \+   mempty = pure $ pureRep zero                                  \+;  {-# INLINE mempty #-}                                         \+}++#define deriveMultiplicativeSemigroup(ty)                                    \+instance (Multiplicative-Semigroup) a => Semigroup (Multiplicative (ty a)) where { \+   (<>) = liftA2 $ mzipWithRep (*)                                     \+;  {-# INLINE (<>) #-}                                                 \+}++#define deriveMultiplicativeMonoid(ty)                                 \+instance (Multiplicative-Monoid) a => Monoid (Multiplicative (ty a)) where { \+   mempty = pure $ pureRep one                                  \+;  {-# INLINE mempty #-}                                         \+}++#define deriveMultiplicativeMatrixSemigroup(ty)                                    \+instance Semiring a => Semigroup (Multiplicative (ty a)) where { \+   (<>) = liftA2 $ (.#.)                                                           \+;  {-# INLINE (<>) #-}                                                             \+}++#define deriveMultiplicativeMatrixMonoid(ty)                                       \+instance Semiring a => Monoid (Multiplicative (ty a)) where {       \+   mempty = pure identity                                                          \+;  {-# INLINE mempty #-}                                                           \+}++#define deriveAdditiveMagma(ty)                                  \+instance (Additive-Group) a => Magma (Additive (ty a)) where {   \+   (<<) = liftA2 $ mzipWithRep (-)                               \+;  {-# INLINE (<<) #-}                                           \+}++#define deriveAdditiveQuasigroup(ty)                               \+instance (Additive-Group) a => Quasigroup (Additive (ty a)) \++#define deriveAdditiveLoop(ty)                               \+instance (Additive-Group) a => Loop (Additive (ty a)) \++#define deriveAdditiveGroup(ty)                               \+instance (Additive-Group) a => Group (Additive (ty a)) \++#define derivePresemiring(ty)              \+instance Semiring a => Presemiring (ty a)  \++#define deriveSemiring(ty)              \+instance Semiring a => Semiring (ty a)  \++#define deriveRing(ty)          \+instance Ring a => Ring (ty a)  \++#define deriveFreeLeftSemimodule(ty)                          \+instance Semiring a => LeftSemimodule a (ty a) where {        \+   lscale = lscaleDef                                         \+;  {-# INLINE lscale #-}                                      \+}++#define deriveFreeRightSemimodule(ty)                         \+instance Semiring a => RightSemimodule a (ty a) where {       \+   rscale = rscaleDef                                         \+;  {-# INLINE rscale #-}                                      \+}++#define deriveFreeBisemimodule(ty)                \+instance Semiring a => Bisemimodule a a (ty a)    \++#define deriveBisemimodule(tyl, tyr, ty)                      \+instance Semiring a => Bisemimodule (tyl a) (tyr a) (ty a)    \++#define deriveLeftSemimodule(tyl,ty)                          \+instance Semiring a => LeftSemimodule (tyl a) (ty a) where {  \+   lscale = (.#.)                                             \+;  {-# INLINE lscale #-}                                      \+}++#define deriveRightSemimodule(tyr,ty)                         \+instance Semiring a => RightSemimodule (tyr a) (ty a) where { \+   rscale = flip (.#.)                                        \+;  {-# INLINE rscale #-}                                      \+}++#define deriveBisemimodule(tyl, tyr, ty)                      \+instance Semiring a => Bisemimodule (tyl a) (tyr a) (ty a)    \++++-- V1+deriveAdditiveSemigroup(V1)+deriveAdditiveMonoid(V1)++deriveAdditiveMagma(V1)+deriveAdditiveQuasigroup(V1)+deriveAdditiveLoop(V1)+deriveAdditiveGroup(V1)++deriveFreeLeftSemimodule(V1)+deriveFreeRightSemimodule(V1)+deriveFreeBisemimodule(V1)+++-- V2+deriveAdditiveSemigroup(V2)+deriveAdditiveMonoid(V2)++deriveAdditiveMagma(V2)+deriveAdditiveQuasigroup(V2)+deriveAdditiveLoop(V2)+deriveAdditiveGroup(V2)++deriveFreeLeftSemimodule(V2)+deriveFreeRightSemimodule(V2)+deriveFreeBisemimodule(V2)+++-- V3+deriveAdditiveSemigroup(V3)+deriveAdditiveMonoid(V3)++deriveAdditiveMagma(V3)+deriveAdditiveQuasigroup(V3)+deriveAdditiveLoop(V3)+deriveAdditiveGroup(V3)++deriveFreeLeftSemimodule(V3)+deriveFreeRightSemimodule(V3)+deriveFreeBisemimodule(V3)++-- V4+deriveAdditiveSemigroup(V4)+deriveAdditiveMonoid(V4)++deriveAdditiveMagma(V4)+deriveAdditiveQuasigroup(V4)+deriveAdditiveLoop(V4)+deriveAdditiveGroup(V4)++deriveFreeLeftSemimodule(V4)+deriveFreeRightSemimodule(V4)+deriveFreeBisemimodule(V4)++-- M11+deriveAdditiveSemigroup(M11)+deriveAdditiveMonoid(M11)++deriveAdditiveMagma(M11)+deriveAdditiveQuasigroup(M11)+deriveAdditiveLoop(M11)+deriveAdditiveGroup(M11)++deriveLeftSemimodule(M11, M11)+deriveRightSemimodule(M11, M11)+deriveBisemimodule(M11, M11, M11)++deriveMultiplicativeMatrixSemigroup(M11)+deriveMultiplicativeMatrixMonoid(M11)++derivePresemiring(M11)+deriveSemiring(M11)+deriveRing(M11)++-- M21+deriveAdditiveSemigroup(M21)+deriveAdditiveMonoid(M21)++deriveAdditiveMagma(M21)+deriveAdditiveQuasigroup(M21)+deriveAdditiveLoop(M21)+deriveAdditiveGroup(M21)++deriveLeftSemimodule(M22, M21)+deriveRightSemimodule(M11, M21)+deriveBisemimodule(M22, M11, M21)+++-- M31+deriveAdditiveSemigroup(M31)+deriveAdditiveMonoid(M31)++deriveAdditiveMagma(M31)+deriveAdditiveQuasigroup(M31)+deriveAdditiveLoop(M31)+deriveAdditiveGroup(M31)++deriveLeftSemimodule(M33, M31)+deriveRightSemimodule(M11, M31)+deriveBisemimodule(M33, M11, M31)+++-- M41+deriveAdditiveSemigroup(M41)+deriveAdditiveMonoid(M41)++deriveAdditiveMagma(M41)+deriveAdditiveQuasigroup(M41)+deriveAdditiveLoop(M41)+deriveAdditiveGroup(M41)++deriveLeftSemimodule(M44, M41)+deriveRightSemimodule(M11, M41)+deriveBisemimodule(M44, M11, M41)+++-- M12+deriveAdditiveSemigroup(M12)+deriveAdditiveMonoid(M12)++deriveAdditiveMagma(M12)+deriveAdditiveQuasigroup(M12)+deriveAdditiveLoop(M12)+deriveAdditiveGroup(M12)++deriveLeftSemimodule(M11, M12)+deriveRightSemimodule(M22, M12)+deriveBisemimodule(M11, M22, M12)+++-- M22+deriveAdditiveSemigroup(M22)+deriveAdditiveMonoid(M22)++deriveAdditiveMagma(M22)+deriveAdditiveQuasigroup(M22)+deriveAdditiveLoop(M22)+deriveAdditiveGroup(M22)++deriveLeftSemimodule(M22, M22)+deriveRightSemimodule(M22, M22)+deriveBisemimodule(M22, M22, M22)++deriveMultiplicativeMatrixSemigroup(M22)+deriveMultiplicativeMatrixMonoid(M22)++derivePresemiring(M22)+deriveSemiring(M22)+deriveRing(M22)+++-- M32+deriveAdditiveSemigroup(M32)+deriveAdditiveMonoid(M32)++deriveAdditiveMagma(M32)+deriveAdditiveQuasigroup(M32)+deriveAdditiveLoop(M32)+deriveAdditiveGroup(M32)++deriveLeftSemimodule(M33, M32)+deriveRightSemimodule(M22, M32)+deriveBisemimodule(M33, M22, M32)+++-- M42+deriveAdditiveSemigroup(M42)+deriveAdditiveMonoid(M42)++deriveAdditiveMagma(M42)+deriveAdditiveQuasigroup(M42)+deriveAdditiveLoop(M42)+deriveAdditiveGroup(M42)++deriveLeftSemimodule(M44, M42)+deriveRightSemimodule(M22, M42)+deriveBisemimodule(M44, M22, M42)+++-- M13+deriveAdditiveSemigroup(M13)+deriveAdditiveMonoid(M13)++deriveAdditiveMagma(M13)+deriveAdditiveQuasigroup(M13)+deriveAdditiveLoop(M13)+deriveAdditiveGroup(M13)++deriveLeftSemimodule(M11, M13)+deriveRightSemimodule(M33, M13)+deriveBisemimodule(M11, M33, M13)+++-- M23+deriveAdditiveSemigroup(M23)+deriveAdditiveMonoid(M23)++deriveAdditiveMagma(M23)+deriveAdditiveQuasigroup(M23)+deriveAdditiveLoop(M23)+deriveAdditiveGroup(M23)++deriveLeftSemimodule(M22, M23)+deriveRightSemimodule(M33, M23)+deriveBisemimodule(M22, M33, M23)+++-- M33+deriveAdditiveSemigroup(M33)+deriveAdditiveMonoid(M33)++deriveAdditiveMagma(M33)+deriveAdditiveQuasigroup(M33)+deriveAdditiveLoop(M33)+deriveAdditiveGroup(M33)++deriveLeftSemimodule(M33, M33)+deriveRightSemimodule(M33, M33)+deriveBisemimodule(M33, M33, M33)++deriveMultiplicativeMatrixSemigroup(M33)+deriveMultiplicativeMatrixMonoid(M33)++derivePresemiring(M33)+deriveSemiring(M33)+deriveRing(M33)+++-- M43+deriveAdditiveSemigroup(M43)+deriveAdditiveMonoid(M43)++deriveAdditiveMagma(M43)+deriveAdditiveQuasigroup(M43)+deriveAdditiveLoop(M43)+deriveAdditiveGroup(M43)++deriveLeftSemimodule(M44, M43)+deriveRightSemimodule(M33, M43)+deriveBisemimodule(M44, M33, M43)+++-- M14+deriveAdditiveSemigroup(M14)+deriveAdditiveMonoid(M14)++deriveAdditiveMagma(M14)+deriveAdditiveQuasigroup(M14)+deriveAdditiveLoop(M14)+deriveAdditiveGroup(M14)++deriveLeftSemimodule(M11, M14)+deriveRightSemimodule(M44, M14)+deriveBisemimodule(M11, M44, M14)+++-- M24+deriveAdditiveSemigroup(M24)+deriveAdditiveMonoid(M24)++deriveAdditiveMagma(M24)+deriveAdditiveQuasigroup(M24)+deriveAdditiveLoop(M24)+deriveAdditiveGroup(M24)++deriveLeftSemimodule(M22, M24)+deriveRightSemimodule(M44, M24)+deriveBisemimodule(M22, M44, M24)+++-- M34+deriveAdditiveSemigroup(M34)+deriveAdditiveMonoid(M34)++deriveAdditiveMagma(M34)+deriveAdditiveQuasigroup(M34)+deriveAdditiveLoop(M34)+deriveAdditiveGroup(M34)++deriveLeftSemimodule(M33, M34)+deriveRightSemimodule(M44, M34)+deriveBisemimodule(M33, M44, M34)+++-- M44+deriveAdditiveSemigroup(M44)+deriveAdditiveMonoid(M44)++deriveAdditiveMagma(M44)+deriveAdditiveQuasigroup(M44)+deriveAdditiveLoop(M44)+deriveAdditiveGroup(M44)++deriveLeftSemimodule(M44, M44)+deriveRightSemimodule(M44, M44)+deriveBisemimodule(M44, M44, M44)++deriveMultiplicativeMatrixSemigroup(M44)+deriveMultiplicativeMatrixMonoid(M44)++derivePresemiring(M44)+deriveSemiring(M44)+deriveRing(M44)
− src/Data/Semimodule/Matrix.hs
@@ -1,552 +0,0 @@-{-# LANGUAGE CPP                        #-}-{-# LANGUAGE Safe                       #-}-{-# LANGUAGE PolyKinds                  #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE DefaultSignatures          #-}-{-# LANGUAGE DeriveFunctor              #-}-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE TypeFamilies               #-}-{-# LANGUAGE RebindableSyntax           #-}-{-# LANGUAGE RankNTypes                 #-}--module Data.Semimodule.Matrix (-    type M22-  , type M23-  , type M24-  , type M32-  , type M33-  , type M34-  , type M42-  , type M43-  , type M44-  , lensRep-  , grateRep-  , tran-  , row-  , rows-  , col-  , cols-  , (.#)-  , (.*)-  , (#.)-  , (*.)-  , (.#.)-  , (.*.)-  , outer-  , scale-  , dirac-  , identity-  , transpose-  , trace-  , diagonal-  , bdet2-  , det2-  , inv2-  , bdet3-  , det3-  , inv3-  , bdet4-  , det4-  , inv4-  , m22-  , m23-  , m24-  , m32-  , m33-  , m34-  , m42-  , m43-  , m44-  ) where--import safe Data.Bool-import safe Data.Distributive-import safe Data.Functor.Compose-import safe Data.Functor.Rep-import safe Data.Semifield-import safe Data.Semigroup.Additive-import safe Data.Semigroup.Multiplicative-import safe Data.Semimodule-import safe Data.Semimodule.Transform-import safe Data.Semimodule.Vector-import safe Data.Semiring-import safe Data.Tuple-import safe Prelude hiding (Num(..), Fractional(..), sum, negate)----- All matrices use row-major representation.---- | A 2x2 matrix.-type M22 a = V2 (V2 a)---- | A 2x3 matrix.-type M23 a = V2 (V3 a)---- | A 2x4 matrix.-type M24 a = V2 (V4 a)---- | A 3x2 matrix.-type M32 a = V3 (V2 a)---- | A 3x3 matrix.-type M33 a = V3 (V3 a)---- | A 3x4 matrix.-type M34 a = V3 (V4 a)---- | A 4x2 matrix.-type M42 a = V4 (V2 a)---- | A 4x3 matrix.-type M43 a = V4 (V3 a)---- | A 4x4 matrix.-type M44 a = V4 (V4 a)--lensRep :: Eq (Rep f) => Representable f => Rep f -> forall g. Functor g => (a -> g a) -> f a -> g (f a)-lensRep i f s = setter s <$> f (getter s)-  where getter = flip index i-        setter s' b = tabulate $ \j -> bool (index s' j) b (i == j)-{-# INLINE lensRep #-}--grateRep :: Representable f => forall g. Functor g => (Rep f -> g a -> b) -> g (f a) -> f b-grateRep iab s = tabulate $ \i -> iab i (fmap (`index` i) s)-{-# INLINE grateRep #-}---- @ ('.#') = 'app' . 'tran' @-tran :: Semiring a => Basis b f => Basis c g => Foldable g => f (g a) -> Tran a b c-tran m = Tran $ \f -> index $ m .# (tabulate f)---- | Retrieve a row of a row-major matrix or element of a row vector.------ >>> row I21 (V2 1 2)--- 1----row :: Representable f => Rep f -> f a -> a-row = flip index-{-# INLINE row #-}---- | Retrieve a column of a row-major matrix.------ >>> row I22 . col I31 $ V2 (V3 1 2 3) (V3 4 5 6)--- 4----col :: Functor f => Representable g => Rep g -> f (g a) -> f a-col j = flip index j . distribute-{-# INLINE col #-}---- | Outer product of two vectors.------ >>> V2 1 1 `outer` V2 1 1--- V2 (V2 1 1) (V2 1 1)----outer :: Semiring a => Functor f => Functor g => f a -> g a -> f (g a)-outer x y = fmap (\z-> fmap (*z) y) x--infixl 7 #.---- | Multiply a matrix on the left by a row vector.------ >>> V2 1 2 #. m23 3 4 5 6 7 8--- V3 15 18 21------ >>> V2 1 2 #. m23 3 4 5 6 7 8 #. m32 1 0 0 0 0 0--- V2 15 0----(#.) :: (Semiring a, Free f, Foldable f, Free g) => f a -> f (g a) -> g a-x #. y = tabulate (\j -> x .*. col j y)-{-# INLINE (#.) #-}--infixr 7 .#, .#.---- | Multiply a matrix on the right by a column vector.------ @ ('.#') = 'app' . 'fromMatrix' @------ >>> m23 1 2 3 4 5 6 .# V3 7 8 9--- V2 50 122------ >>> m22 1 0 0 0 .# m23 1 2 3 4 5 6 .# V3 7 8 9--- V2 50 0----(.#) :: (Semiring a, Free f, Free g, Foldable g) => f (g a) -> g a -> f a-x .# y = tabulate (\i -> row i x .*. y)-{-# INLINE (.#) #-}---- | Multiply two matrices.------ >>> m22 1 2 3 4 .#. m22 1 2 3 4 :: M22 Int--- V2 (V2 7 10) (V2 15 22)--- --- >>> m23 1 2 3 4 5 6 .#. m32 1 2 3 4 4 5 :: M22 Int--- V2 (V2 19 25) (V2 43 58)----(.#.) :: (Semiring a, Free f, Free g, Free h, Foldable g) => f (g a) -> g (h a) -> f (h a)-(.#.) x y = getCompose $ tabulate (\(i,j) -> row i x .*. col j y)-{-# INLINE (.#.) #-}---- | Obtain a diagonal matrix from a vector.------ >>> scale (V2 2 3)--- V2 (V2 2 0) (V2 0 3)----scale :: (Additive-Monoid) a => Free f => f a -> f (f a)-scale f = flip imapRep f $ \i x -> flip imapRep f (\j _ -> bool zero x $ i == j)-{-# INLINE scale #-}---- | Identity matrix.------ >>> identity :: M44 Int--- V4 (V4 1 0 0 0) (V4 0 1 0 0) (V4 0 0 1 0) (V4 0 0 0 1)------ >>> identity :: V3 (V3 Int)--- V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)----identity :: Semiring a => Free f => f (f a)-identity = scale $ pureRep one-{-# INLINE identity #-}---- | Compute the trace of a matrix.------ >>> trace (V2 (V2 a b) (V2 c d))--- a <> d----trace :: Semiring a => Free f => Foldable f => f (f a) -> a-trace = sum . diagonal-{-# INLINE trace #-}---- | Obtain the diagonal of a matrix as a vector.------ >>> diagonal (V2 (V2 a b) (V2 c d))--- V2 a d----diagonal :: Representable f => f (f a) -> f a-diagonal = flip bindRep id-{-# INLINE diagonal #-}--ij :: Representable f => Representable g => Rep f -> Rep g -> f (g a) -> a-ij i j = row i . col j---- | 2x2 matrix bdeterminant over a commutative semiring.------ >>> bdet2 $ m22 1 2 3 4--- (4,6)----bdet2 :: Semiring a => Basis I2 f => Basis I2 g => f (g a) -> (a, a)-bdet2 m = (ij I21 I21 m * ij I22 I22 m, ij I21 I22 m * ij I22 I21 m)-{-# INLINE bdet2 #-}---- | 2x2 matrix determinant over a commutative ring.------ @--- 'det2' '==' 'uncurry' ('-') . 'bdet2'--- @------ >>> det2 $ m22 1 2 3 4 :: Double--- -2.0----det2 :: Ring a => Basis I2 f => Basis I2 g => f (g a) -> a-det2 = uncurry (-) . bdet2 -{-# INLINE det2 #-}---- | 2x2 matrix inverse over a field.------ >>> inv2 $ m22 1 2 3 4 :: M22 Double--- V2 (V2 (-2.0) 1.0) (V2 1.5 (-0.5))----inv2 :: Field a => Basis I2 f => Basis I2 g => f (g a) -> g (f a) -inv2 m = multl (recip $ det2 m) <$> m22 d (-b) (-c) a where-  a = ij I21 I21 m-  b = ij I21 I22 m-  c = ij I22 I21 m-  d = ij I22 I22 m-{-# INLINE inv2 #-}---- | 3x3 matrix bdeterminant over a commutative semiring.------ >>> bdet3 (V3 (V3 1 2 3) (V3 4 5 6) (V3 7 8 9))--- (225, 225)----bdet3 :: Semiring a => Basis I3 f => Basis I3 g => f (g a) -> (a, a)-bdet3 m = (evens, odds) where-  evens = a*e*i + g*b*f + d*h*c-  odds  = a*h*f + d*b*i + g*e*c-  a = ij I31 I31 m-  b = ij I31 I32 m-  c = ij I31 I33 m-  d = ij I32 I31 m-  e = ij I32 I32 m-  f = ij I32 I33 m-  g = ij I33 I31 m-  h = ij I33 I32 m-  i = ij I33 I33 m-{-# INLINE bdet3 #-}---- | 3x3 double-precision matrix determinant.------ @--- 'det3' '==' 'uncurry' ('-') . 'bdet3'--- @------ Implementation uses a cofactor expansion to avoid loss of precision.------ >>> det3 (V3 (V3 1 2 3) (V3 4 5 6) (V3 7 8 9))--- 0----det3 :: Ring a => Basis I3 f => Basis I3 g => f (g a) -> a-det3 m = a * (e*i-f*h) - d * (b*i-c*h) + g * (b*f-c*e) where-  a = ij I31 I31 m-  b = ij I31 I32 m-  c = ij I31 I33 m-  d = ij I32 I31 m-  e = ij I32 I32 m-  f = ij I32 I33 m-  g = ij I33 I31 m-  h = ij I33 I32 m-  i = ij I33 I33 m-{-# INLINE det3 #-}---- | 3x3 matrix inverse.------ >>> inv3 $ m33 1 2 4 4 2 2 1 1 1 :: M33 Double--- V3 (V3 0.0 0.5 (-1.0)) (V3 (-0.5) (-0.75) 3.5) (V3 0.5 0.25 (-1.5))----inv3 :: forall a f g. Field a => Basis I3 f => Basis I3 g => f (g a) -> g (f a)-inv3 m = multl (recip $ det3 m) <$> m33 a' b' c' d' e' f' g' h' i' where-  a = ij I31 I31 m-  b = ij I31 I32 m-  c = ij I31 I33 m-  d = ij I32 I31 m-  e = ij I32 I32 m-  f = ij I32 I33 m-  g = ij I33 I31 m-  h = ij I33 I32 m-  i = ij I33 I33 m-  a' = cofactor (e,f,h,i)-  b' = cofactor (c,b,i,h)-  c' = cofactor (b,c,e,f)-  d' = cofactor (f,d,i,g)-  e' = cofactor (a,c,g,i)-  f' = cofactor (c,a,f,d)-  g' = cofactor (d,e,g,h)-  h' = cofactor (b,a,h,g)-  i' = cofactor (a,b,d,e)-  cofactor (q,r,s,t) = det2 (m22 q r s t :: M22 a)-{-# INLINE inv3 #-}---- | 4x4 matrix bdeterminant over a commutative semiring.------ >>> bdet4 (V4 (V4 1 2 3 4) (V4 5 6 7 8) (V4 9 10 11 12) (V4 13 14 15 16))--- (27728,27728)----bdet4 :: Semiring a => Basis I4 f => Basis I4 g => f (g a) -> (a, a) -bdet4 x = (evens, odds) where-  evens = a * (f*k*p + g*l*n + h*j*o) +-          b * (g*i*p + e*l*o + h*k*m) +-          c * (e*j*p + f*l*m + h*i*n) +-          d * (f*i*o + e*k*n + g*j*m)-  odds =  a * (g*j*p + f*l*o + h*k*n) +-          b * (e*k*p + g*l*m + h*i*o) +-          c * (f*i*p + e*l*n + h*j*m) +-          d * (e*j*o + f*k*m + g*i*n)-  a = ij I41 I41 x-  b = ij I41 I42 x-  c = ij I41 I43 x-  d = ij I41 I44 x-  e = ij I42 I41 x-  f = ij I42 I42 x-  g = ij I42 I43 x-  h = ij I42 I44 x-  i = ij I43 I41 x-  j = ij I43 I42 x-  k = ij I43 I43 x-  l = ij I43 I44 x-  m = ij I44 I41 x-  n = ij I44 I42 x-  o = ij I44 I43 x-  p = ij I44 I44 x-{-# INLINE bdet4 #-}---- | 4x4 matrix determinant over a commutative ring.------ @--- 'det4' '==' 'uncurry' ('-') . 'bdet4'--- @------ This implementation uses a cofactor expansion to avoid loss of precision.------ >>> det4 (m44 1 0 3 2 2 0 2 1 0 0 0 1 0 3 4 0 :: M44 Rational)--- (-12) % 1----det4 :: Ring a => Basis I4 f => Basis I4 g => f (g a) -> a-det4 x = s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0 where-  s0 = i00 * i11 - i10 * i01-  s1 = i00 * i12 - i10 * i02-  s2 = i00 * i13 - i10 * i03-  s3 = i01 * i12 - i11 * i02-  s4 = i01 * i13 - i11 * i03-  s5 = i02 * i13 - i12 * i03--  c5 = i22 * i33 - i32 * i23-  c4 = i21 * i33 - i31 * i23-  c3 = i21 * i32 - i31 * i22-  c2 = i20 * i33 - i30 * i23-  c1 = i20 * i32 - i30 * i22-  c0 = i20 * i31 - i30 * i21--  i00 = ij I41 I41 x-  i01 = ij I41 I42 x-  i02 = ij I41 I43 x-  i03 = ij I41 I44 x-  i10 = ij I42 I41 x-  i11 = ij I42 I42 x-  i12 = ij I42 I43 x-  i13 = ij I42 I44 x-  i20 = ij I43 I41 x-  i21 = ij I43 I42 x-  i22 = ij I43 I43 x-  i23 = ij I43 I44 x-  i30 = ij I44 I41 x-  i31 = ij I44 I42 x-  i32 = ij I44 I43 x-  i33 = ij I44 I44 x-{-# INLINE det4 #-}---- | 4x4 matrix inverse.------ >>> row I41 $ inv4 (m44 1 0 3 2 2 0 2 1 0 0 0 1 0 3 4 0 :: M44 Rational)--- V4 (6 % (-12)) ((-9) % (-12)) ((-3) % (-12)) (0 % (-12))----inv4 :: forall a f g. Field a => Basis I4 f => Basis I4 g => f (g a) -> g (f a)-inv4 x =  multl (recip det) <$> x' where-  i00 = ij I41 I41 x-  i01 = ij I41 I42 x-  i02 = ij I41 I43 x-  i03 = ij I41 I44 x-  i10 = ij I42 I41 x-  i11 = ij I42 I42 x-  i12 = ij I42 I43 x-  i13 = ij I42 I44 x-  i20 = ij I43 I41 x-  i21 = ij I43 I42 x-  i22 = ij I43 I43 x-  i23 = ij I43 I44 x-  i30 = ij I44 I41 x-  i31 = ij I44 I42 x-  i32 = ij I44 I43 x-  i33 = ij I44 I44 x--  s0 = i00 * i11 - i10 * i01-  s1 = i00 * i12 - i10 * i02-  s2 = i00 * i13 - i10 * i03-  s3 = i01 * i12 - i11 * i02-  s4 = i01 * i13 - i11 * i03-  s5 = i02 * i13 - i12 * i03-  c5 = i22 * i33 - i32 * i23-  c4 = i21 * i33 - i31 * i23-  c3 = i21 * i32 - i31 * i22-  c2 = i20 * i33 - i30 * i23-  c1 = i20 * i32 - i30 * i22-  c0 = i20 * i31 - i30 * i21--  det = s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0--  x' = m44 (i11 * c5 - i12 * c4 + i13 * c3)-           (-i01 * c5 + i02 * c4 - i03 * c3)-           (i31 * s5 - i32 * s4 + i33 * s3)-           (-i21 * s5 + i22 * s4 - i23 * s3)-           (-i10 * c5 + i12 * c2 - i13 * c1)-           (i00 * c5 - i02 * c2 + i03 * c1)-           (-i30 * s5 + i32 * s2 - i33 * s1)-           (i20 * s5 - i22 * s2 + i23 * s1)-           (i10 * c4 - i11 * c2 + i13 * c0)-           (-i00 * c4 + i01 * c2 - i03 * c0)-           (i30 * s4 - i31 * s2 + i33 * s0)-           (-i20 * s4 + i21 * s2 - i23 * s0)-           (-i10 * c3 + i11 * c1 - i12 * c0)-           (i00 * c3 - i01 * c1 + i02 * c0)-           (-i30 * s3 + i31 * s1 - i32 * s0)-           (i20 * s3 - i21 * s1 + i22 * s0)-{-# INLINE inv4 #-}---- | Construct a 2x2 matrix.------ Arguments are in row-major order.------ >>> m22 1 2 3 4 :: M22 Int--- V2 (V2 1 2) (V2 3 4)------ @ 'm22' :: a -> a -> a -> a -> 'M22' a @----m22 :: Basis I2 f => Basis I2 g => a -> a -> a -> a -> f (g a)-m22 a b c d = fillI2 (fillI2 a b) (fillI2 c d)-{-# INLINE m22 #-}---- | Construct a 2x3 matrix.------ Arguments are in row-major order.------ @ 'm23' :: a -> a -> a -> a -> a -> a -> 'M23' a @----m23 :: Basis I2 f => Basis I3 g => a -> a -> a -> a -> a -> a -> f (g a)-m23 a b c d e f = fillI2 (fillI3 a b c) (fillI3 d e f)-{-# INLINE m23 #-}---- | Construct a 2x4 matrix.------ Arguments are in row-major order.----m24 :: Basis I2 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> f (g a)-m24 a b c d e f g h = fillI2 (fillI4 a b c d) (fillI4 e f g h)-{-# INLINE m24 #-}---- | Construct a 3x2 matrix.------ Arguments are in row-major order.----m32 :: Basis I3 f => Basis I2 g => a -> a -> a -> a -> a -> a -> f (g a)-m32 a b c d e f = fillI3 (fillI2 a b) (fillI2 c d) (fillI2 e f)-{-# INLINE m32 #-}---- | Construct a 3x3 matrix.------ Arguments are in row-major order.----m33 :: Basis I3 f => Basis I3 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)-m33 a b c d e f g h i = fillI3 (fillI3 a b c) (fillI3 d e f) (fillI3 g h i)-{-# INLINE m33 #-}---- | Construct a 3x4 matrix.------ Arguments are in row-major order.----m34 :: Basis I3 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)-m34 a b c d e f g h i j k l = fillI3 (fillI4 a b c d) (fillI4 e f g h) (fillI4 i j k l)-{-# INLINE m34 #-}---- | Construct a 4x2 matrix.------ Arguments are in row-major order.----m42 :: Basis I4 f => Basis I2 g => a -> a -> a -> a -> a -> a -> a -> a -> f (g a)-m42 a b c d e f g h = fillI4 (fillI2 a b) (fillI2 c d) (fillI2 e f) (fillI2 g h)-{-# INLINE m42 #-}---- | Construct a 4x3 matrix.------ Arguments are in row-major order.----m43 :: Basis I4 f => Basis I3 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)-m43 a b c d e f g h i j k l = fillI4 (fillI3 a b c) (fillI3 d e f) (fillI3 g h i) (fillI3 j k l)-{-# INLINE m43 #-}---- | Construct a 4x4 matrix.------ Arguments are in row-major order.----m44 :: Basis I4 f => Basis I4 g => a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> f (g a)-m44 a b c d e f g h i j k l m n o p = fillI4 (fillI4 a b c d) (fillI4 e f g h) (fillI4 i j k l) (fillI4 m n o p)-{-# INLINE m44 #-}
src/Data/Semimodule/Transform.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE CPP                        #-} {-# LANGUAGE Safe                       #-}-{-# LANGUAGE PolyKinds                  #-} {-# LANGUAGE ConstraintKinds            #-} {-# LANGUAGE DefaultSignatures          #-} {-# LANGUAGE DeriveFunctor              #-}@@ -14,7 +13,42 @@ {-# LANGUAGE RankNTypes                 #-}  -module Data.Semimodule.Transform where+module Data.Semimodule.Transform (+  -- * Types+    type (**) +  , type (++) +  , type Dim+  , type Endo+  , Tran(..)+  , app+  , arr+  , invmap+  -- * Matrix combinators+  , rows+  , cols+  , projl+  , projr+  , compl+  , compr+  , complr+  , transpose+  -- * Dimensional combinators+  , braid+  , sbraid+  , first+  , second+  , left+  , right+  , (***)+  , (+++)+  , (&&&)+  , (|||)+  , ($$$)+  , adivide+  , adivide'+  , aselect+  , aselect'+) where  import safe Control.Category (Category, (>>>)) import safe Data.Functor.Compose@@ -28,41 +62,28 @@ import safe qualified Control.Category as C import safe qualified Data.Bifunctor as B -{--app' = app @I3 @V3 @I3 @V3 @Int---- >>> app' foo $ V3 1 2 3--- V3 2 1 3--- >>> app' foo >>> app' foo $ V3 1 2 3--- V3 1 2 3--- >>> app' (foo >>> foo) $ V3 1 2 3--- V3 1 2 3----foo = Tran $ \f -> f . t- where-  t I31 = I32-  t I32 = I31-  t I33 = I33--}-+infixr 2 **+infixr 1 ++ ----------------------------------------------------------------------+type (f ** g) = Compose f g+type (f ++ g) = Product f g --- | A binary relation between two basis indices.+-- | A dimensional (binary) relation between two bases. ----- @ 'Index' b c @ relations correspond to (compositions of) +-- @ 'Dim' b c @ relations correspond to (compositions of)  -- permutation, projection, and embedding transformations. -- -- See also < https://en.wikipedia.org/wiki/Logical_matrix >. ---type Index b c = forall a . Tran a b c+type Dim b c = forall a . Tran a b c --- | A general linear transformation between free semimodules indexed with bases /b/ and /c/.+-- | An endomorphism over a free semimodule. ---newtype Tran a b c = Tran { runTran :: (c -> a) -> (b -> a) } deriving Functor+type Endo a b = Tran a b b -app :: Basis b f => Basis c g => Tran a b c -> g a -> f a-app t = tabulate . runTran t . index+-- | A morphism between free semimodules indexed with bases /b/ and /c/.+--+newtype Tran a b c = Tran { runTran :: (c -> a) -> (b -> a) } deriving Functor  instance Category (Tran a) where   id = Tran id@@ -72,6 +93,20 @@   lmap f (Tran t) = Tran $ \ca -> t ca . f   rmap = fmap +---------------------------------------------------------------------++-- | Apply a transformation to a vector.+--+app :: Basis2 b c f g => Tran a b c -> g a -> f a+app t = tabulate . runTran t . index++-- | Lift a function on basis indices into a transformation.+--+-- @ 'arr' f = 'rmap' f 'C.id' @+--+arr :: (b -> c) -> Tran a b c+arr f = Tran (. f)+ -- | /Tran a b c/ is an invariant functor on /a/. -- -- See also < http://comonad.com/reader/2008/rotten-bananas/ >.@@ -81,17 +116,13 @@  --------------------------------------------------------------------- --- | An endomorphism over a free semimodule.----type Endo a b = Tran a b b- -- | Obtain a matrix by stacking rows. -- -- >>> rows (V2 1 2) :: M22 Int -- V2 (V2 1 2) (V2 1 2) ---rows :: Free f => Free g => g a -> f (g a)-rows = getCompose . app in1 +rows :: Basis2 b c f g => g a -> (f**g) a+rows = app $ arr snd {-# INLINE rows #-}  -- | Obtain a matrix by stacking columns.@@ -99,42 +130,48 @@ -- >>> cols (V2 1 2) :: M22 Int -- V2 (V2 1 1) (V2 2 2) ---cols :: Free f => Free g => f a -> f (g a)-cols = getCompose . app in2+cols :: Basis2 b c f g => f a -> (f**g) a+cols = app $ arr fst {-# INLINE cols #-} -projl :: Free f => Free g => Product f g a -> f a-projl = app exl+-- | Project onto the left-hand component of a direct sum.+--+projl :: Basis2 b c f g => (f++g) a -> f a+projl = app $ arr Left+{-# INLINE projl #-} -projr :: Free f => Free g => Product f g a -> g a-projr = app exr+-- | Project onto the right-hand component of a direct sum.+--+projr :: Basis2 b c f g => (f++g) a -> g a+projr = app $ arr Right+{-# INLINE projr #-}  -- | Left (post) composition with a linear transformation. ---compl :: Basis b f1 => Basis c f2 => Free g => Index b c -> f2 (g a) -> f1 (g a)-compl f = getCompose . app (first f) . Compose+compl :: Basis3 b c d f1 f2 g => Dim b c -> (f2**g) a -> (f1**g) a+compl f = app (first f)  -- | Right (pre) composition with a linear transformation. ---compr :: Basis b g1 => Basis c g2 => Free f => Index b c -> f (g2 a) -> f (g1 a)-compr f = getCompose . app (second f) . Compose+compr :: Basis3 b c d f g1 g2 => Dim c d -> (f**g2) a -> (f**g1) a+compr f = app (second f)  -- | Left and right composition with a linear transformation. ----- @ 'complr f g' = 'compl f' . 'compr g' @+-- @ 'complr' f g = 'compl' f '>>>' 'compr' g @ -- -- When /f . g = id/ this induces a similarity transformation: ----- >>> perm1 = arr (+ I32)--- >>> perm2 = arr (+ I33)+-- >>> perm1 = arr (+ E32)+-- >>> perm2 = arr (+ E33) -- >>> m = m33 1 2 3 4 5 6 7 8 9 :: M33 Int--- >>> conjugate perm1 perm2 m :: M33 Int+-- >>> complr perm1 perm2 m :: M33 Int -- V3 (V3 5 6 4) (V3 8 9 7) (V3 2 3 1) -- -- See also < https://en.wikipedia.org/wiki/Matrix_similarity > & < https://en.wikipedia.org/wiki/Conjugacy_class >. ---complr :: Basis b1 f1 => Basis c1 f2 => Basis b2 g1 => Basis c2 g2 => Index b1 c1 -> Index b2 c2 -> f2 (g2 a) -> f1 (g1 a)-complr f g =  getCompose . app (f *** g) . Compose+complr :: Basis2 b1 c1 f1 f2 => Basis2 b2 c2 g1 g2 => Dim b1 c1 -> Dim b2 c2 -> (f2**g2) a -> (f1**g1) a+complr f g = app (f *** g)  -- | Transpose a matrix. --@@ -144,104 +181,99 @@ -- >>> 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)-transpose = getCompose . app braid . Compose+transpose :: Basis2 b c f g => (f**g) a -> (g**f) a+transpose = app braid {-# INLINE transpose #-}  --------------------------------------------------------------------- --- arr toI3 :: Dim3 e => Index e I3---- @ 'arr' f = 'rmap' f 'C.id' @-arr :: (b -> c) -> Index b c-arr f = Tran (. f)--in1 :: Index (a , b) b-in1 = arr snd-{-# INLINE in1 #-}--in2 :: Index (a , b) a-in2 = arr fst-{-# INLINE in2 #-}--exl :: Index a (a + b)-exl = arr Left-{-# INLINE exl #-}--exr :: Index b (a + b)-exr = arr Right-{-# INLINE exr #-}--braid :: Index (a , b) (b , a)+-- | Swap components of a tensor product.+--+braid :: Dim (a , b) (b , a) braid = arr swap {-# INLINE braid #-} -ebraid :: Index (a + b) (b + a)-ebraid = arr eswap-{-# INLINE ebraid #-}+-- | Swap components of a direct sum.+--+sbraid :: Dim (a + b) (b + a)+sbraid = arr eswap+{-# INLINE sbraid #-} -first :: Index b c -> Index (b , d) (c , d)+-- | Lift a transform into a transform on tensor products.+--+first :: Dim b c -> Dim (b , d) (c , d) first (Tran caba) = Tran $ \cda -> cda . B.first (caba id) -second :: Index b c -> Index (d , b) (d , c)+-- | Lift a transform into a transform on tensor products.+--+second :: Dim b c -> Dim (d , b) (d , c) second (Tran caba) = Tran $ \cda -> cda . B.second (caba id) -left :: Index b c -> Index (b + d) (c + d)+-- | Lift a transform into a transform on direct sums.+--+left :: Dim b c -> Dim (b + d) (c + d) left (Tran caba) = Tran $ \cda -> cda . B.first (caba id) -right :: Index b c -> Index (d + b) (d + c)+-- | Lift a transform into a transform on direct sums.+--+right :: Dim b c -> Dim (d + b) (d + c) right (Tran caba) = Tran $ \cda -> cda . B.second (caba id)  infixr 3 *** -(***) :: Index a1 b1 -> Index a2 b2 -> Index (a1 , a2) (b1 , b2)+-- | Create a transform on a tensor product of semimodules.+--+(***) :: Dim a1 b1 -> Dim a2 b2 -> Dim (a1 , a2) (b1 , b2) x *** y = first x >>> arr swap >>> first y >>> arr swap {-# INLINE (***) #-}  infixr 2 +++ -(+++) :: Index a1 b1 -> Index a2 b2 -> Index (a1 + a2) (b1 + b2)+-- | Create a transform on a direct sum of semimodules.+--+(+++) :: Dim a1 b1 -> Dim a2 b2 -> Dim (a1 + a2) (b1 + b2) x +++ y = left x >>> arr eswap >>> left y >>> arr eswap {-# INLINE (+++) #-}  infixr 3 &&& -(&&&) :: Index a b1 -> Index a b2 -> Index a (b1 , b2)+(&&&) :: Dim a b1 -> Dim a b2 -> Dim a (b1 , b2) x &&& y = dimap fork id $ x *** y {-# INLINE (&&&) #-}  infixr 2 ||| -(|||) :: Index a1 b -> Index a2 b -> Index (a1 + a2) b+(|||) :: Dim a1 b -> Dim a2 b -> Dim (a1 + a2) b x ||| y = dimap id join $ x +++ y {-# INLINE (|||) #-}  infixr 0 $$$ -($$$) :: Index a (b -> c) -> Index a b -> Index a c+($$$) :: Dim a (b -> c) -> Dim a b -> Dim a c ($$$) f x = dimap fork apply (f *** x) {-# INLINE ($$$) #-} -adivide :: (a -> (a1 , a2)) -> Index a1 b -> Index a2 b -> Index a b+-- |+--+-- @ 'adivide' 'fork' = 'C.id' @ +--+adivide :: (a -> (a1 , a2)) -> Dim a1 b -> Dim a2 b -> Dim a b adivide f x y = dimap f fst $ x *** y {-# INLINE adivide #-} -adivide' :: Index a b -> Index a b -> Index a b-adivide' = adivide fork+adivide' :: Dim a1 b -> Dim a2 b -> Dim (a1 , a2) b+adivide' = adivide id {-# INLINE adivide' #-} -adivided :: Index a1 b -> Index a2 b -> Index (a1 , a2) b-adivided = adivide id-{-# INLINE adivided #-}--aselect :: ((b1 + b2) -> b) -> Index a b1 -> Index a b2 -> Index a b+-- |+--+-- @ 'aselect' 'join' = 'C.id' @ +--+aselect :: ((b1 + b2) -> b) -> Dim a b1 -> Dim a b2 -> Dim a b aselect f x y = dimap Left f $ x +++ y {-# INLINE aselect #-} -aselect' :: Index a b -> Index a b -> Index a b-aselect' = aselect join+aselect' :: Dim a b1 -> Dim a b2 -> Dim a (b1 + b2)+aselect' = aselect id {-# INLINE aselect' #-} -aselected :: Index a b1 -> Index a b2 -> Index a (b1 + b2)-aselected = aselect id-{-# INLINE aselected #-}
− src/Data/Semimodule/Vector.hs
@@ -1,461 +0,0 @@-{-# LANGUAGE CPP                        #-}-{-# LANGUAGE Safe                       #-}-{-# LANGUAGE PolyKinds                  #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE DefaultSignatures          #-}-{-# LANGUAGE DeriveFunctor              #-}-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE NoImplicitPrelude          #-}-{-# LANGUAGE RebindableSyntax           #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE TypeFamilies               #-}-{-# LANGUAGE RankNTypes               #-}--module Data.Semimodule.Vector (-    type Basis-  , (*.)-  , (.*)-  , (.*.)-  , (><)-  , triple-  , lerp-  , quadrance-  , qd-  , dirac-  , module Data.Semimodule.Vector-) where--import safe Control.Applicative-import safe Data.Algebra-import safe Data.Bool-import safe Data.Distributive-import safe Data.Functor.Rep-import safe Data.Semifield-import safe Data.Semigroup.Foldable as Foldable1-import safe Data.Semimodule-import safe Data.Semiring-import safe Prelude hiding (Num(..), Fractional(..), negate, sum, product)------------------------------------------------------------------------------------ V2----------------------------------------------------------------------------------data V2 a = V2 !a !a deriving (Eq,Ord,Show)---- | Vector addition.------ >>> V2 1 2 <> V2 3 4--- V2 4 6----instance (Additive-Semigroup) a => Semigroup (V2 a) where-  (<>) = mzipWithRep (+)---- | Matrix addition.------ >>> m23 1 2 3 4 5 6 <> m23 7 8 9 1 2 3 :: M23 Int--- V2 (V3 8 10 12) (V3 5 7 9)----instance (Additive-Semigroup) a => Semigroup (Additive (V2 a)) where-  (<>) = liftA2 $ mzipWithRep (+)--instance (Additive-Monoid) a => Monoid (V2 a) where-  mempty = pureRep zero--instance (Additive-Monoid) a => Monoid (Additive (V2 a)) where-  mempty = pure $ pureRep zero---- | Vector subtraction.------ >>> V2 1 2 << V2 3 4--- V2 (-2) (-2)----instance (Additive-Group) a => Magma (V2 a) where-  (<<) = mzipWithRep (-)---- | Matrix subtraction.------ >>> m23 1 2 3 4 5 6 << m23 7 8 9 1 2 3 :: M23 Int--- V2 (V3 (-6) (-6) (-6)) (V3 3 3 3)----instance (Additive-Group) a => Magma (Additive (V2 a)) where-  (<<) = liftA2 $ mzipWithRep (-)--instance (Additive-Group) a => Quasigroup (V2 a)-instance (Additive-Group) a => Quasigroup (Additive (V2 a))-instance (Additive-Group) a => Loop (V2 a)-instance (Additive-Group) a => Loop (Additive (V2 a)) -instance (Additive-Group) a => Group (V2 a)-instance (Additive-Group) a => Group (Additive (V2 a)) --instance Semiring a => Semimodule a (V2 a) where-  (*.) = multl-  {-# INLINE (*.) #-}--instance Functor V2 where-  fmap f (V2 a b) = V2 (f a) (f b)-  {-# INLINE fmap #-}-  a <$ _ = V2 a a-  {-# INLINE (<$) #-}--instance Applicative V2 where-  pure = pureRep-  liftA2 = liftR2--instance Foldable V2 where-  foldMap f (V2 a b) = f a <> f b-  {-# INLINE foldMap #-}-  null _ = False-  length _ = two--instance Foldable1 V2 where-  foldMap1 f (V2 a b) = f a <> f b-  {-# INLINE foldMap1 #-}--instance Distributive V2 where-  distribute f = V2 (fmap (\(V2 x _) -> x) f) (fmap (\(V2 _ y) -> y) f)-  {-# INLINE distribute #-}--instance Representable V2 where-  type Rep V2 = I2-  tabulate f = V2 (f I21) (f I22)-  {-# INLINE tabulate #-}--  index (V2 x _) I21 = x-  index (V2 _ y) I22 = y-  {-# INLINE index #-}------------------------------------------------------------------------------------ Standard basis on two real dimensions----------------------------------------------------------------------------------data I2 = I21 | I22 deriving (Eq, Ord, Show)--i2 :: a -> a -> I2 -> a-i2 x _ I21 = x-i2 _ y I22 = y--fillI2 :: Basis I2 f => a -> a -> f a-fillI2 x y = tabulate $ i2 x y--instance Semigroup (Additive I2) where-  Additive I21 <> x = x-  x <> Additive I21 = x- -  Additive I22 <> Additive I22 = Additive I21--instance Monoid (Additive I2) where-  mempty = pure I21---- trivial diagonal algebra-instance Semiring r => Algebra r I2 where-  multiplyWith f = f' where-    fi = f I21 I21-    fj = f I22 I22--    f' I21 = fi-    f' I22 = fj--instance Semiring r => Composition r I2 where-  conjugateWith = id--  normWith f = flip multiplyWith I21 $ \ix1 ix2 ->-                 flip multiplyWith I22 $ \jx1 jx2 ->-                   f ix1 * f ix2 + f jx1 * f jx2------------------------------------------------------------------------------------ V3-----------------------------------------------------------------------------------data V3 a = V3 !a !a !a deriving (Eq,Ord,Show)---- | Vector addition.------ >>> V3 1 2 3 <> V3 4 5 6--- V3 5 7 9----instance (Additive-Semigroup) a => Semigroup (V3 a) where-  (<>) = mzipWithRep (+)---- | Matrix addition.------ >>> V2 (V3 1 2 3) (V3 4 5 6) <> V2 (V3 7 8 9) (V3 1 2 3)--- V2 (V3 8 10 12) (V3 5 7 9)----instance (Additive-Semigroup) a => Semigroup (Additive (V3 a)) where-  (<>) = liftA2 $ mzipWithRep (+)--instance (Additive-Monoid) a => Monoid (V3 a) where-  mempty = pureRep zero--instance (Additive-Monoid) a => Monoid (Additive (V3 a)) where-  mempty = pure $ pureRep zero---- | Vector subtraction.------ >>> V3 1 2 3 << V3 4 5 6--- V3 (-3) (-3) (-3)----instance (Additive-Group) a => Magma (V3 a) where-  (<<) = mzipWithRep (-)---- | Matrix subtraction.------ >>> V3 (V3 1 2 3) (V3 4 5 6) (V3 7 8 9) << V3 (V3 7 8 9) (V3 7 8 9) (V3 7 8 9) --- V3 (V3 (-6) (-6) (-6)) (V3 (-3) (-3) (-3)) (V3 0 0 0)----instance (Additive-Group) a => Magma (Additive (V3 a)) where-  (<<) = liftA2 $ mzipWithRep (-)--instance (Additive-Group) a => Quasigroup (V3 a)-instance (Additive-Group) a => Quasigroup (Additive (V3 a))-instance (Additive-Group) a => Loop (V3 a)-instance (Additive-Group) a => Loop (Additive (V3 a)) -instance (Additive-Group) a => Group (V3 a)-instance (Additive-Group) a => Group (Additive (V3 a)) --instance Semiring a => Semimodule a (V3 a) where-  (*.) = multl-  {-# INLINE (*.) #-}--instance Functor V3 where-  fmap f (V3 a b c) = V3 (f a) (f b) (f c)-  {-# INLINE fmap #-}-  a <$ _ = V3 a a a-  {-# INLINE (<$) #-}--instance Applicative V3 where-  pure = pureRep-  liftA2 = liftR2--instance Foldable V3 where-  foldMap f (V3 a b c) = f a <> f b <> f c-  {-# INLINE foldMap #-}-  null _ = False-  --length _ = 3--instance Foldable1 V3 where-  foldMap1 f (V3 a b c) = f a <> f b <> f c-  {-# INLINE foldMap1 #-}--instance Distributive V3 where-  distribute f = V3 (fmap (\(V3 x _ _) -> x) f) (fmap (\(V3 _ y _) -> y) f) (fmap (\(V3 _ _ z) -> z) f)-  {-# INLINE distribute #-}--instance Representable V3 where-  type Rep V3 = I3-  tabulate f = V3 (f I31) (f I32) (f I33)-  {-# INLINE tabulate #-}--  index (V3 x _ _) I31 = x-  index (V3 _ y _) I32 = y-  index (V3 _ _ z) I33 = z-  {-# INLINE index #-}------------------------------------------------------------------------------------ Standard basis on three real dimensions ----------------------------------------------------------------------------------data I3 = I31 | I32 | I33 deriving (Eq, Ord, Show)--i3 :: a -> a -> a -> I3 -> a-i3 x _ _ I31 = x-i3 _ y _ I32 = y-i3 _ _ z I33 = z--fillI3 :: Basis I3 f => a -> a -> a -> f a-fillI3 x y z = tabulate $ i3 x y z--instance Semigroup (Additive I3) where-  Additive I31 <> x = x-  x <> Additive I31 = x- -  Additive I32 <> Additive I33 = Additive I31 -  Additive I33 <> Additive I32 = Additive I31--  Additive I32 <> Additive I32 = Additive I33-  Additive I33 <> Additive I33 = Additive I32--instance Monoid (Additive I3) where-  mempty = pure I31--instance Ring r => Algebra r I3 where-  multiplyWith f = f' where-    i31 = f I32 I33 - f I33 I32-    i32 = f I33 I31 - f I31 I33-    i33 = f I31 I32 - f I32 I31 -    f' I31 = i31-    f' I32 = i32-    f' I33 = i33--instance Ring r => Composition r I3 where-  conjugateWith = id--  normWith f = flip multiplyWith' I31 $ \ix1 ix2 ->-                 flip multiplyWith' I32 $ \jx1 jx2 ->-                   flip multiplyWith' I33 $ \kx1 kx2 ->-                     f ix1 * f ix2 + f jx1 * f jx2 + f kx1 * f kx2--   where-    multiplyWith' f1 = f1' where-      i31 = f1 I31 I31-      i32 = f1 I32 I32-      i33 = f1 I33 I33-      f1' I31 = i31-      f1' I32 = i32-      f1' I33 = i33------------------------------------------------------------------------------------- QuaternionBasis----------------------------------------------------------------------------------type QuaternionBasis = Maybe I3--instance Ring r => Algebra r QuaternionBasis where-  multiplyWith f = maybe fe f' where-    e = Nothing-    i = Just I31-    j = Just I32-    k = Just I33-    fe = f e e - (f i i + f j j + f k k)-    fi = f e i + f i e + (f j k - f k j)-    fj = f e j + f j e + (f k i - f i k)-    fk = f e k + f k e + (f i j - f j i)-    f' I31 = fi-    f' I32 = fj-    f' I33 = fk--instance Ring r => Unital r QuaternionBasis where-  unitWith x Nothing = x -  unitWith _ _ = zero--instance Ring r => Composition r QuaternionBasis where-  conjugateWith f = maybe fe f' where-    fe = f Nothing-    f' I31 = negate . f $ Just I31-    f' I32 = negate . f $ Just I32-    f' I33 = negate . f $ Just I33--  normWith f = flip multiplyWith zero $ \ix1 ix2 -> f ix1 * conjugateWith f ix2--instance Field r => Division r QuaternionBasis where-  reciprocalWith f i = conjugateWith f i / normWith f -{--reciprocal'' x = divq unit x--divq (Quaternion r0 (V3 r1 r2 r3)) (Quaternion q0 (V3 q1 q2 q3)) =- (/denom) <$> Quaternion (r0*q0 + r1*q1 + r2*q2 + r3*q3) imag-  where denom = q0*q0 + q1*q1 + q2*q2 + q3*q3-        imag = (V3 (r0*q1 + (negate r1*q0) + (negate r2*q3) + r3*q2)-                   (r0*q2 + r1*q3 + (negate r2*q0) + (negate r3*q1))-                   (r0*q3 + (negate r1*q2) + r2*q1 + (negate r3*q0)))---}------------------------------------------------------------------------------------ V4----------------------------------------------------------------------------------data V4 a = V4 !a !a !a !a deriving (Eq,Ord,Show)---- | Vector addition.------ >>> V4 1 2 3 4 <> V4 5 6 7 8--- V4 6 8 10 12 ----instance (Additive-Semigroup) a => Semigroup (V4 a) where-  (<>) = mzipWithRep (+)---- | Matrix addition.------ >>> m24 1 2 3 4 5 6 7 8 <> m24 1 2 3 4 5 6 7 8 :: M24 Int--- V2 (V4 2 4 6 8) (V4 10 12 14 16)----instance (Additive-Semigroup) a => Semigroup (Additive (V4 a)) where-  (<>) = liftA2 $ mzipWithRep (+)--instance (Additive-Monoid) a => Monoid (V4 a) where-  mempty = pureRep zero--instance (Additive-Monoid) a => Monoid (Additive (V4 a)) where-  mempty = pure $ pureRep zero---- | Vector subtraction.------ >>> V4 1 2 3 << V4 4 5 6--- V4 (-3) (-3) (-3)----instance (Additive-Group) a => Magma (V4 a) where-  (<<) = mzipWithRep (-)---- | Matrix subtraction.------ >>> V4 (V4 1 2 3) (V4 4 5 6) (V4 7 8 9) << V4 (V4 7 8 9) (V4 7 8 9) (V4 7 8 9) --- V4 (V4 (-6) (-6) (-6)) (V4 (-3) (-3) (-3)) (V4 0 0 0)----instance (Additive-Group) a => Magma (Additive (V4 a)) where-  (<<) = liftA2 $ mzipWithRep (-)--instance (Additive-Group) a => Quasigroup (V4 a)-instance (Additive-Group) a => Quasigroup (Additive (V4 a))-instance (Additive-Group) a => Loop (V4 a)-instance (Additive-Group) a => Loop (Additive (V4 a)) -instance (Additive-Group) a => Group (V4 a)-instance (Additive-Group) a => Group (Additive (V4 a)) --instance Semiring a => Semimodule a (V4 a) where-  (*.) = multl-  {-# INLINE (*.) #-}--instance Functor V4 where-  fmap f (V4 a b c d) = V4 (f a) (f b) (f c) (f d)-  {-# INLINE fmap #-}-  a <$ _ = V4 a a a a-  {-# INLINE (<$) #-}--instance Applicative V4 where-  pure = pureRep-  liftA2 = liftR2--instance Foldable V4 where-  foldMap f (V4 a b c d) = f a <> f b <> f c <> f d-  {-# INLINE foldMap #-}-  null _ = False-  length _ = two + two--instance Foldable1 V4 where-  foldMap1 f (V4 a b c d) = f a <> f b <> f c <> f d-  {-# INLINE foldMap1 #-}--instance Distributive V4 where-  distribute f = V4 (fmap (\(V4 x _ _ _) -> x) f) (fmap (\(V4 _ y _ _) -> y) f) (fmap (\(V4 _ _ z _) -> z) f) (fmap (\(V4 _ _ _ w) -> w) f)-  {-# INLINE distribute #-}--instance Representable V4 where-  type Rep V4 = I4-  tabulate f = V4 (f I41) (f I42) (f I43) (f I44)-  {-# INLINE tabulate #-}--  index (V4 x _ _ _) I41 = x-  index (V4 _ y _ _) I42 = y-  index (V4 _ _ z _) I43 = z-  index (V4 _ _ _ w) I44 = w-  {-# INLINE index #-}------------------------------------------------------------------------------------ Standard basis on four real dimensions----------------------------------------------------------------------------------data I4 = I41 | I42 | I43 | I44 deriving (Eq, Ord, Show)--i4 :: a -> a -> a -> a -> I4 -> a-i4 x _ _ _ I41 = x-i4 _ y _ _ I42 = y-i4 _ _ z _ I43 = z-i4 _ _ _ w I44 = w--fillI4 :: Basis I4 f => a -> a -> a -> a -> f a-fillI4 x y z w = tabulate $ i4 x y z w
src/Data/Semiring.hs view
@@ -11,23 +11,35 @@ {-# LANGUAGE MonoLocalBinds             #-}  module Data.Semiring (+  -- * Types     type (-)-  , zero, one, two, (+), (*), (-), (^)-  , sum, sum1, sumWith, sumWith1-  , product, product1, productWith, productWith1-  , cross, cross1-  , eval, evalWith, eval1, evalWith1-  , negate, abs, signum+  -- * Presemirings   , type PresemiringLaw, Presemiring+  , (+), (*)+  , sum1, sumWith1+  , product1, productWith1+  , xmult1+  , eval1, evalWith1+  -- * Semirings   , type SemiringLaw, Semiring+  , zero, one, two+  , (^)+  , sum, sumWith+  , product, productWith+  , xmult   +  , eval, evalWith+  -- * Rings   , type RingLaw, Ring+  , (-)+  , negate, abs, signum+  -- * Re-exports+  , mreplicate   , Additive(..)   , Multiplicative(..)   , Magma(..)-  , Quasigroup(..)-  , Loop(..)+  , Quasigroup+  , Loop   , Group(..)-  , mreplicate ) where  import safe Control.Applicative@@ -68,7 +80,7 @@ -- /Distributivity/ -- -- @--- (a '+' b) '*' c '==' (a '*' c) '+' (b '*' c)+-- (a '+' b) '*' c = (a '*' c) '+' (b '*' c) -- @ -- -- Note that addition and multiplication needn't be commutative.@@ -79,6 +91,71 @@  class PresemiringLaw a => Presemiring a +-- | Evaluate a non-empty presemiring sum.+--+sum1 :: Presemiring a => Foldable1 f => f a -> a+sum1 = sumWith1 id++-- | 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 :: Foldable1 t => Presemiring a => (b -> a) -> t b -> a+sumWith1 f = unAdditive . foldMap1 (Additive . f)+{-# INLINE sumWith1 #-}++-- | Evaluate a non-empty presemiring product.+--+product1 :: Presemiring a => Foldable1 f => f a -> a+product1 = productWith1 id++-- | 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 :: Foldable1 t => Presemiring a => (b -> a) -> t b -> a+productWith1 f = unMultiplicative . foldMap1 (Multiplicative . f)+{-# INLINE productWith1 #-}++-- | Cross-multiply two non-empty collections.+--+-- >>> xmult1 (Right 2 :| [Left "oops"]) (Right 2 :| [Right 3]) :: Either [Char] Int+-- Right 4+--+xmult1 :: Foldable1 f => Apply f => Presemiring a => f a -> f a -> a+xmult1 a b = sum1 $ liftF2 (*) a b+{-# INLINE xmult1 #-}++-- | Evaluate a presemiring expression.+-- +eval1 :: Presemiring a => Functor f => Foldable1 f => Foldable1 g => f (g a) -> a+eval1 = sum1 . fmap product1++-- | 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+evalWith1 f = sum1 . fmap product1 . (fmap . fmap) f+ ------------------------------------------------------------------------------- -- Semiring -------------------------------------------------------------------------------@@ -94,76 +171,68 @@ -- /Neutrality/ -- -- @--- 'zero' '+' r '==' r--- 'one' '*' r '==' r+-- 'zero' '+' r = r+-- 'one' '*' r = r -- @ -- -- /Absorbtion/ -- -- @--- 'zero' '*' a '==' 'zero'+-- 'zero' '*' a = 'zero' -- @ -- class (Presemiring a, SemiringLaw a) => Semiring a -two :: (Additive-Semigroup) a => (Multiplicative-Monoid) a => a+-- |+--+-- @+-- 'two' = 'one' '+' 'one'+-- @+--+two :: Semiring a => a two = one + one {-# INLINE two #-} - infixr 8 ^ --- @ 'one' == a '^' 0 @+-- | Evaluate a natural-numbered power of a semiring element. --+-- @ 'one' = a '^' 0 @+-- -- >>> 8 ^ 0 :: Int -- 1 -- (^) :: Semiring a => a -> Natural -> a a ^ n = unMultiplicative $ mreplicate (P.fromIntegral n) (Multiplicative a) +-- | Evaluate a semiring sum.+--  -- >>> sum [1..5 :: Int] -- 15+-- sum :: (Additive-Monoid) a => Presemiring a => Foldable f => f a -> a sum = sumWith id -sum1 :: Presemiring a => Foldable1 f => f a -> a-sum1 = sumWith1 id-+-- | Evaluate a semiring sum using a given semiring.+--  sumWith :: (Additive-Monoid) a => Presemiring a => Foldable t => (b -> a) -> t b -> a sumWith f = foldr' ((+) . f) zero {-# INLINE sumWith #-} --- >>> 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+-- | Evaluate a semiring product. ---sumWith1 :: Foldable1 t => Presemiring a => (b -> a) -> t b -> a-sumWith1 f = unAdditive . foldMap1 (Additive . f)-{-# INLINE sumWith1 #-}- -- >>> product [1..5 :: Int] -- 120+-- product :: (Multiplicative-Monoid) a => Presemiring a => Foldable f => f a -> a product = productWith id +-- | Evaluate a semiring product using a given semiring. ----- | The product of at a list of semiring elements (of length at least one)-product1 :: Presemiring a => Foldable1 f => f a -> a-product1 = productWith1 id---- | Fold over a collection using the multiplicative operation of an arbitrary semiring.---  -- @--- 'product' f '==' 'Data.foldr'' ((*) . f) 'one'+-- 'product' f = 'Data.foldr'' (('*') . f) 'one' -- @ ----- -- >>> productWith Just [1..5 :: Int] -- Just 120 --@@ -171,43 +240,18 @@ productWith f = foldr' ((*) . f) one {-# INLINE productWith #-} ---- | Fold over a non-empty collection using the multiplicative operation of a semiring.------ As the collection is non-empty this does not require a distinct multiplicative unit:------ >>> productWith1 Just $ 1 :| [2..5 :: Int]--- Just 120--- >>> productWith1 First $ 1 :| [2..(5 :: Int)]--- First {getFirst = 15}--- >>> productWith1 First $ Nothing :| [Just (5 :: Int), Just 6,  Nothing]--- First {getFirst = Just 11}----productWith1 :: Foldable1 t => Presemiring a => (b -> a) -> t b -> a-productWith1 f = unMultiplicative . foldMap1 (Multiplicative . f)-{-# INLINE productWith1 #-}- -- | Cross-multiply two collections. ----- >>> cross (V3 1 2 3) (V3 1 2 3)+-- >>> xmult (V3 1 2 3) (V3 1 2 3) -- 14--- >>> cross [1,2,3 :: Int] [1,2,3]+-- >>> xmult [1,2,3 :: Int] [1,2,3] -- 36--- >>> cross [1,2,3 :: Int] []+-- >>> xmult [1,2,3 :: Int] [] -- 0 ---cross :: Foldable f => Applicative f => Presemiring a => (Additive-Monoid) a => f a -> f a -> a-cross a b = sum $ liftA2 (*) a b-{-# INLINE cross #-}---- | Cross-multiply two non-empty collections.------ >>> cross1 (Right 2 :| [Left "oops"]) (Right 2 :| [Right 3]) :: Either [Char] Int--- Right 4----cross1 :: Foldable1 f => Apply f => Presemiring a => f a -> f a -> a-cross1 a b = sum1 $ liftF2 (*) a b-{-# INLINE cross1 #-}+xmult :: Foldable f => Applicative f => Presemiring a => (Additive-Monoid) a => f a -> f a -> a+xmult a b = sum $ liftA2 (*) a b+{-# INLINE xmult #-}  -- | Evaluate a semiring expression. -- @@ -221,22 +265,14 @@ eval :: Semiring a => Functor f => Foldable f => Foldable g => f (g a) -> a eval = sum . fmap product +-- | 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 evalWith f = sum . fmap product . (fmap . fmap) f -eval1 :: Presemiring a => Functor f => Foldable1 f => Foldable1 g => f (g a) -> a-eval1 = sum1 . fmap product1---- >>>  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-evalWith1 f = sum1 . fmap product1 . (fmap . fmap) f- ------------------------------------------------------------------------------- -- Ring -------------------------------------------------------------------------------@@ -249,9 +285,9 @@ -- -- The basic properties of a ring follow immediately from the axioms: -- --- @ r '*' 'zero' '==' 'zero' '==' 'zero' '*' r @+-- @ r '*' 'zero' = 'zero' = 'zero' '*' r @ ----- @ 'negate' 'one' '*' r '==' 'negate' 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/). --@@ -270,177 +306,12 @@ -- class (Semiring a, RingLaw a) => Ring a where -negate :: (Additive-Group) a => a -> a-negate a = zero - a-{-# INLINE negate #-}---- | Absolute value of an element.------ @ 'abs' r '==' 'mul' r ('signum' r) @------ https://en.wikipedia.org/wiki/Linearly_ordered_group-abs :: (Additive-Group) a => Ord a => a -> a-abs x = bool (negate x) x $ zero <= x-{-# INLINE abs #-}- -- satisfies trichotomy law: -- Exactly one of the following is true: a is positive, -a is positive, or a = 0. -- This property follows from the fact that ordered rings are abelian, linearly ordered groups with respect to addition.-signum :: RingLaw a => Ord a => a -> a+signum :: Ring a => Ord a => a -> a signum x = bool (negate one) one $ zero <= x {-# INLINE signum #-}--{---- | Default implementation of 'fromBoolean' given a multiplicative unit.----fromBooleanDef :: Unital a => a -> Bool -> a-fromBooleanDef _ False = mempty-fromBooleanDef o True = o-{-# INLINE fromBooleanDef #-}---- | Multiplicative unit.------ Note that 'one' needn't be distinct from 'mempty' for a semiring to be valid.----one :: Unital a => a-one = fromBoolean True-{-# INLINE one #-}---infixr 8 ^--(^) :: Unital a => a -> Natural -> a-(^) = flip sinnum'-{-# INLINE (^) #-}---- | A generalization of 'Data.List.replicate' to an arbitrary 'Monoid'. ------ Adapted from <http://augustss.blogspot.com/2008/07/lost-and-found-if-i-write-108-in.html>.----sinnum :: Monoid a => Natural -> a -> a-sinnum n a-    | n == 0 = mempty-    | otherwise = f a n-    where-        f x y -            | even y = f (x <> x) (y `quot` 2)-            | y == 1 = x-            | otherwise = g (x <> x) ((y N.- 1) `quot` 2) x-        g x y z -            | even y = g (x <> x) (y `quot` 2) z-            | y == 1 = x <> z-            | otherwise = g (x <> x) ((y N.- 1) `quot` 2) (x <> z)-{-# INLINE sinnum #-}--sinnum' :: Unital a => Natural -> a -> a-sinnum' n a = getProd $ sinnum n (Prod a)-{-# INLINE sinnum' #-}--powers :: Unital a => Natural -> a -> a-powers n a = foldr' (<>) one . flip unfoldr n $ \m -> -  if m == 0 then Nothing else Just (a^m,m N.- 1)-{-# INLINE powers #-}------------------------------------------------------------------------------------ Pre-semirings----------------------------------------------------------------------------------instance Semigroup a => Semiring (Either e a) where-  (*) = liftA2 (<>)-  {-# INLINE (*) #-}---instance Semiring Ordering where-  LT * LT = LT-  LT * GT = LT-  _  * EQ = EQ-  EQ * _  = EQ-  GT * x  = x--  fromBoolean = fromBooleanDef GT----  fromBoolean = const . fromBoolean--instance Unital a => Semiring (Op a b) where-  Op f * Op g = Op $ \x -> f x * g x-  {-# INLINE (*) #-}--  fromBoolean = fromBooleanDef $ Op (const one)--instance (Unital a, Unital b) => Semiring (a, b) where-  (a, b) * (c, d) = (a*c, b*d)-  {-# INLINE (*) #-}--  fromBoolean = liftA2 (,) fromBoolean fromBoolean--instance (Unital a, Unital b, Unital c) => Semiring (a, b, c) where-  (a, b, c) * (d, e, f) = (a*d, b*e, c*f)-  {-# INLINE (*) #-}--  fromBoolean = liftA3 (,,) fromBoolean fromBoolean fromBoolean-----{--------------------------------------------------------------------------  Instances (contravariant)-------------------------------------------------------------------------- Note that due to the underlying 'Monoid' instance this instance--- has 'All' semiring semantics rather than 'Any'.-instance Semiring (Predicate a) where-  Predicate f * Predicate g = Predicate $ \x -> f x || g x-  {-# INLINE (*) #-}--  --Note that the truth values are flipped here to create a-  --valid semiring homomorphism. Users should precompose with 'not'-  --where necessary. -  fromBoolean False = Predicate $ const True-  fromBoolean True = Predicate $ const False----- Note that due to the underlying 'Monoid' instance this instance--- has 'All' semiring semantics rather than 'Any'.-instance Semiring (Equivalence a) where-  Equivalence f * Equivalence g = Equivalence $ \x y -> f x y || g x y-  {-# INLINE (*) #-}--  --Note that the truth values are flipped here to create a-  --valid semiring homomorphism. Users should precompose with 'not'-  --where necessary. -  fromBoolean False = Equivalence $ \_ _ -> True-  fromBoolean True = Equivalence $ \_ _ -> False--}--------------------------------------------------------------------------  Instances (containers)------------------------------------------------------------------------instance Ord a => Semiring (Set.Set a) where-  (*) = Set.intersection--instance Monoid a => Semiring (Seq.Seq a) where-  (*) = liftA2 (<>)-  {-# INLINE (*) #-}--  fromBoolean = fromBooleanDef $ Seq.singleton mempty--instance (Ord k, Monoid k, Monoid a) => Semiring (Map.Map k a) where-  xs * ys = foldMap (flip Map.map xs . (<>)) ys-  {-# INLINE (*) #-}--  fromBoolean = fromBooleanDef $ Map.singleton mempty mempty--instance Monoid a => Semiring (IntMap.IntMap a) where-  xs * ys = foldMap (flip IntMap.map xs . (<>)) ys-  {-# INLINE (*) #-}--  fromBoolean = fromBooleanDef $ IntMap.singleton 0 mempty---}  --------------------------------------------------------------------- --  Instances
src/Data/Semiring/Property.hs view
@@ -17,8 +17,8 @@   , annihilative_multiplication_on   , distributive_finite_on   -- * Left-distributive presemirings and semirings-  , distributive_cross_on-  , distributive_cross1_on+  , distributive_xmult_on+  , distributive_xmult1_on   -- * Commutative presemirings & semirings    , commutative_multiplication_on   -- * Cancellative presemirings & semirings @@ -32,10 +32,7 @@ import Data.Foldable (Foldable) import Data.Functor.Apply (Apply) import Data.Semigroup.Foldable (Foldable1)-import Data.Semigroup.Additive-import Data.Semigroup.Multiplicative import Data.Semigroup.Property-import qualified Test.Function  as Prop import qualified Test.Operation as Prop  import Prelude hiding (Num(..), sum)@@ -71,32 +68,7 @@   morphism_distribitive_on (==) f x y z  --------------------------------------------------------------------------------------- Required properties of semigroups---- | \( \forall a, b, c \in R: (a + b) + c \sim a + (b + c) \)------ All semigroups must right-associate addition.------ This is a required property.----associative_addition_on :: (Additive-Semigroup) r => Rel r b -> r -> r -> r -> b-associative_addition_on (~~) = Prop.associative_on (~~) (+) ---- | \( \forall a, b, c \in R: (a * b) * c \sim a * (b * c) \)------ All semigroups must right-associate multiplication.------ This is a required property.----associative_multiplication_on :: (Multiplicative-Semigroup) r => Rel r b -> r -> r -> r -> b-associative_multiplication_on (~~) = Prop.associative_on (~~) (*) ---- | \( \forall a, b \in R: a + b \sim b + a \)------ 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-commutative_addition_on (~~) = Prop.commutative_on (~~) (+) +-- Required properties of semirings  -- | \( \forall a, b, c \in R: (a + b) * c \sim (a * c) + (b * c) \) --@@ -135,18 +107,6 @@ ------------------------------------------------------------------------------------ -- Required properties of semirings -morphism_additive_on :: (Additive-Semigroup) r => (Additive-Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b-morphism_additive_on (~~) f x y = (f $ x + y) ~~ (f x + f y)--morphism_multiplicative_on :: (Multiplicative-Semigroup) r => (Multiplicative-Semigroup) s => Rel s b -> (r -> s) -> r -> r -> b-morphism_multiplicative_on (~~) f x y = (f $ x * y) ~~ (f x * f y)--morphism_additive_on' :: (Additive-Monoid) r => (Additive-Monoid) s => Rel s b -> (r -> s) -> b-morphism_additive_on' (~~) f = (f zero) ~~ zero--morphism_multiplicative_on' :: (Multiplicative-Monoid) r => (Multiplicative-Monoid) s => Rel s b -> (r -> s) -> b-morphism_multiplicative_on' (~~) f = (f one) ~~ one- -- | Semiring morphisms are monoidal presemiring morphisms. -- -- This is a required property for semiring morphisms.@@ -157,45 +117,6 @@   morphism_additive_on' (==) f &&   morphism_multiplicative_on' (==) f ---- | \( \forall a \in R: (z + a) \sim a \)------ A semigroup with a right-neutral additive identity must satisfy:------ @--- 'neutral_addition' 'zero' ~~ const True--- @--- --- Or, equivalently:------ @--- 'zero' '+' r ~~ r--- @------ This is a required property for additive monoids.----neutral_addition_on :: (Additive-Monoid) r => Rel r b -> r -> b-neutral_addition_on (~~) = Prop.neutral_on (~~) (+) zero---- | \( \forall a \in R: (o * a) \sim a \)------ A semigroup with a right-neutral multiplicative identity must satisfy:------ @--- 'neutral_multiplication' 'one' ~~ const True--- @--- --- Or, equivalently:------ @--- 'one' '*' r ~~ r--- @------ This is a required propert for multiplicative monoids.----neutral_multiplication_on :: (Multiplicative-Monoid) r => Rel r b -> r -> b-neutral_multiplication_on (~~) = Prop.neutral_on (~~) (*) one- -- | \( \forall a \in R: (z * a) \sim u \) -- -- A /R/ is semiring then its addititive one must be right-annihilative, i.e.:@@ -237,70 +158,14 @@  -- | \( \forall M,N \geq 0; a_1 \dots a_M, b_1 \dots b_N \in R: (\sum_{i=1}^M a_i) * (\sum_{j=1}^N b_j) \sim \sum_{i=1 j=1}^{i=M j=N} a_i * b_j \) ----- If /R/ is also left-distributive then it supports cross-multiplication.+-- If /R/ is also left-distributive then it supports xmult-multiplication. ---distributive_cross_on :: Semiring r => Applicative f => Foldable f => Rel r b -> f r -> f r -> b-distributive_cross_on (~~) as bs = (sum as * sum bs) ~~ (cross as bs)+distributive_xmult_on :: Semiring r => Applicative f => Foldable f => Rel r b -> f r -> f r -> b+distributive_xmult_on (~~) as bs = (sum as * sum bs) ~~ (xmult as bs)  -- | \( \forall M,N \geq 1; a_1 \dots a_M, b_1 \dots b_N \in R: (\sum_{i=1}^M a_i) * (\sum_{j=1}^N b_j) = \sum_{i=1 j=1}^{i=M j=N} a_i * b_j \) ----- If /R/ is also left-distributive then it supports (non-empty) cross-multiplication.----distributive_cross1_on :: Presemiring r => Apply f => Foldable1 f => Rel r b -> f r -> f r -> b-distributive_cross1_on (~~) as bs = (sum1 as * sum1 bs) ~~ (cross1 as bs)----------------------------------------------------------------------------------------- Commutative presemirings and semirings---- | \( \forall a, b \in R: a * b \sim b * a \)------ This is a an /optional/ property for semigroups, and a /optional/ property for semirings.--- It is a /required/ property for rings.----commutative_multiplication_on :: (Multiplicative-Semigroup) r => Rel r b -> r -> r -> b-commutative_multiplication_on (~~) = Prop.commutative_on (~~) (*) ----------------------------------------------------------------------------------------- Properties of cancellative semigroups---- | \( \forall a, b, c \in R: b + a \sim c + a \Rightarrow b = c \)------ 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-cancellative_addition_on (~~) a = Prop.injective_on (~~) (+ a)---- | \( \forall a, b, c \in R: b * a \sim c * a \Rightarrow b = c \)------ 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-cancellative_multiplication_on (~~) a = Prop.injective_on (~~) (* a)---- | Idempotency property for additive semigroups.------ @ 'idempotent_addition' = 'absorbative_addition' 'one' @--- --- See < https://en.wikipedia.org/wiki/Band_(mathematics) >.------ This is a required property for lattices.----idempotent_addition_on :: (Additive-Semigroup) r => Rel r b -> r -> b-idempotent_addition_on (~~) r = (r + r) ~~ r---- | Idempotency property for semigroups.------ @ 'idempotent_multiplication' = 'absorbative_multiplication' 'zero' @--- --- See < https://en.wikipedia.org/wiki/Band_(mathematics) >.------ This is a an /optional/ property for semigroups, and a /optional/ property for semirings.------ This is a /required/ property for lattices.+-- If /R/ is also left-distributive then it supports (non-empty) xmult-multiplication. ---idempotent_multiplication_on :: (Multiplicative-Semigroup) r => Rel r b -> r -> b-idempotent_multiplication_on (~~) r = (r * r) ~~ r+distributive_xmult1_on :: Presemiring r => Apply f => Foldable1 f => Rel r b -> f r -> f r -> b+distributive_xmult1_on (~~) as bs = (sum1 as * sum1 bs) ~~ (xmult1 as bs)
test/Test/Data/Dioid/Signed.hs view
@@ -146,7 +146,7 @@ x = f 0.37794903 y = f 0.3269925 -cosunit (residl x) y+cosaempty (residl x) y   residl x = Conn (<>x) . (//x) $ y