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
( FromFractional (MkFromFractional),
FromIntegral (MkFromIntegral),
FromNum (MkFromNum),
)
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 (FromNum a) instance (Num a) => AGroup (FromFractional a)
deriving via (FromNum a) instance (Num a) => AGroup (FromIntegral a)
instance (Num a) => AGroup (FromNum a) where
.-. :: FromNum a -> FromNum a -> FromNum a
(.-.) = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> a -> a) @(FromNum a -> FromNum a -> FromNum a) (-)
{-# INLINE (.-.) #-}
deriving via (FromNum Double) instance AGroup Double
deriving via (FromNum Float) instance AGroup Float
deriving via (FromNum Int) instance AGroup Int
deriving via (FromNum Int8) instance AGroup Int8
deriving via (FromNum Int16) instance AGroup Int16
deriving via (FromNum Int32) instance AGroup Int32
deriving via (FromNum Int64) instance AGroup Int64
deriving via (FromNum Integer) instance AGroup Integer
deriving via (FromNum Word) instance AGroup Word
deriving via (FromNum Word8) instance AGroup Word8
deriving via (FromNum Word16) instance AGroup Word16
deriving via (FromNum Word32) instance AGroup Word32
deriving via (FromNum Word64) instance AGroup Word64
deriving via (FromNum (Ratio Integer)) instance AGroup (Ratio Integer)
deriving via (FromNum (Complex a)) instance (RealFloat a) => AGroup (Complex a)
deriving via (FromNum (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 (.-.) #-}