module Numeric.Algebra.Additive.AGroup
( AGroup (..),
anegate,
)
where
import Data.Coerce (coerce)
import Data.Complex (Complex)
import Data.Fixed (Fixed, HasResolution)
import Data.Int (Int16, Int32, Int64, Int8)
import Data.Kind (Constraint, Type)
import Data.Ratio (Ratio)
import Data.Word (Word16, Word32, Word64, Word8)
import Numeric.Algebra.Additive.AMonoid (AMonoid (zero))
import Numeric.Algebra.Deriving
( AsFractional (MkAsFractional),
AsIntegral (MkAsIntegral),
AsNum (MkAsNum),
)
type AGroup :: Type -> Constraint
class (AMonoid g) => AGroup g where
(.-.) :: g -> g -> g
infixl 6 .-.
anegate :: (AGroup g) => g -> g
anegate :: forall g. AGroup g => g -> g
anegate g
n = g
forall m. AMonoid m => m
zero g -> g -> g
forall g. AGroup g => g -> g -> g
.-. g
n
{-# INLINE anegate #-}
deriving via (AsNum a) instance (Num a) => AGroup (AsFractional a)
deriving via (AsNum a) instance (Num a) => AGroup (AsIntegral a)
instance (Num a) => AGroup (AsNum a) where
.-. :: AsNum a -> AsNum a -> AsNum a
(.-.) = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> a -> a) @(AsNum a -> AsNum a -> AsNum a) (-)
{-# INLINE (.-.) #-}
deriving via (AsNum Double) instance AGroup Double
deriving via (AsNum Float) instance AGroup Float
deriving via (AsNum Int) instance AGroup Int
deriving via (AsNum Int8) instance AGroup Int8
deriving via (AsNum Int16) instance AGroup Int16
deriving via (AsNum Int32) instance AGroup Int32
deriving via (AsNum Int64) instance AGroup Int64
deriving via (AsNum Integer) instance AGroup Integer
deriving via (AsNum Word) instance AGroup Word
deriving via (AsNum Word8) instance AGroup Word8
deriving via (AsNum Word16) instance AGroup Word16
deriving via (AsNum Word32) instance AGroup Word32
deriving via (AsNum Word64) instance AGroup Word64
deriving via (AsNum (Ratio Integer)) instance AGroup (Ratio Integer)
deriving via (AsNum (Complex a)) instance (RealFloat a) => AGroup (Complex a)
deriving via (AsNum (Fixed k)) instance (HasResolution k) => AGroup (Fixed k)
instance (AGroup a) => AGroup (a, a) where
(a
x1, a
x2) .-. :: (a, a) -> (a, a) -> (a, a)
.-. (a
y1, a
y2) = (a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1, a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a) where
(a
x1, a
x2, a
x3) .-. :: (a, a, a) -> (a, a, a) -> (a, a, a)
.-. (a
y1, a
y2, a
y3) = (a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1, a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2, a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a, a) where
(a
x1, a
x2, a
x3, a
x4) .-. :: (a, a, a, a) -> (a, a, a, a) -> (a, a, a, a)
.-. (a
y1, a
y2, a
y3, a
y4) =
( a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1,
a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2,
a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3,
a
x4 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y4
)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a, a, a) where
(a
x1, a
x2, a
x3, a
x4, a
x5) .-. :: (a, a, a, a, a) -> (a, a, a, a, a) -> (a, a, a, a, a)
.-. (a
y1, a
y2, a
y3, a
y4, a
y5) =
( a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1,
a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2,
a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3,
a
x4 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y4,
a
x5 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y5
)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a, a, a, a) where
(a
x1, a
x2, a
x3, a
x4, a
x5, a
x6) .-. :: (a, a, a, a, a, a) -> (a, a, a, a, a, a) -> (a, a, a, a, a, a)
.-. (a
y1, a
y2, a
y3, a
y4, a
y5, a
y6) =
( a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1,
a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2,
a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3,
a
x4 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y4,
a
x5 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y5,
a
x6 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y6
)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a, a, a, a, a) where
(a
x1, a
x2, a
x3, a
x4, a
x5, a
x6, a
x7) .-. :: (a, a, a, a, a, a, a)
-> (a, a, a, a, a, a, a) -> (a, a, a, a, a, a, a)
.-. (a
y1, a
y2, a
y3, a
y4, a
y5, a
y6, a
y7) =
( a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1,
a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2,
a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3,
a
x4 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y4,
a
x5 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y5,
a
x6 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y6,
a
x7 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y7
)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a, a, a, a, a, a) where
(a
x1, a
x2, a
x3, a
x4, a
x5, a
x6, a
x7, a
x8) .-. :: (a, a, a, a, a, a, a, a)
-> (a, a, a, a, a, a, a, a) -> (a, a, a, a, a, a, a, a)
.-. (a
y1, a
y2, a
y3, a
y4, a
y5, a
y6, a
y7, a
y8) =
( a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1,
a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2,
a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3,
a
x4 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y4,
a
x5 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y5,
a
x6 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y6,
a
x7 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y7,
a
x8 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y8
)
{-# INLINE (.-.) #-}
instance (AGroup a) => AGroup (a, a, a, a, a, a, a, a, a) where
(a
x1, a
x2, a
x3, a
x4, a
x5, a
x6, a
x7, a
x8, a
x9) .-. :: (a, a, a, a, a, a, a, a, a)
-> (a, a, a, a, a, a, a, a, a) -> (a, a, a, a, a, a, a, a, a)
.-. (a
y1, a
y2, a
y3, a
y4, a
y5, a
y6, a
y7, a
y8, a
y9) =
( a
x1 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y1,
a
x2 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y2,
a
x3 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y3,
a
x4 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y4,
a
x5 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y5,
a
x6 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y6,
a
x7 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y7,
a
x8 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y8,
a
x9 a -> a -> a
forall g. AGroup g => g -> g -> g
.-. a
y9
)
{-# INLINE (.-.) #-}