module Numeric.Algebra.Additive.ASemigroup
( ASemigroup (..),
)
where
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 GHC.Natural (Natural)
type ASemigroup :: Type -> Constraint
class ASemigroup s where
(.+.) :: s -> s -> s
infixl 6 .+.
instance ASemigroup Double where
.+. :: Double -> Double -> Double
(.+.) = Double -> Double -> Double
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Float where
.+. :: Float -> Float -> Float
(.+.) = Float -> Float -> Float
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Int where
.+. :: Int -> Int -> Int
(.+.) = Int -> Int -> Int
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Int8 where
.+. :: Int8 -> Int8 -> Int8
(.+.) = Int8 -> Int8 -> Int8
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Int16 where
.+. :: Int16 -> Int16 -> Int16
(.+.) = Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Int32 where
.+. :: Int32 -> Int32 -> Int32
(.+.) = Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Int64 where
.+. :: Int64 -> Int64 -> Int64
(.+.) = Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Integer where
.+. :: Integer -> Integer -> Integer
(.+.) = Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Word where
.+. :: Word -> Word -> Word
(.+.) = Word -> Word -> Word
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Word8 where
.+. :: Word8 -> Word8 -> Word8
(.+.) = Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Word16 where
.+. :: Word16 -> Word16 -> Word16
(.+.) = Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Word32 where
.+. :: Word32 -> Word32 -> Word32
(.+.) = Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Word64 where
.+. :: Word64 -> Word64 -> Word64
(.+.) = Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup Natural where
.+. :: Natural -> Natural -> Natural
(.+.) = Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup (Ratio Integer) where
.+. :: Ratio Integer -> Ratio Integer -> Ratio Integer
(.+.) = Ratio Integer -> Ratio Integer -> Ratio Integer
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance ASemigroup (Ratio Natural) where
.+. :: Ratio Natural -> Ratio Natural -> Ratio Natural
(.+.) = Ratio Natural -> Ratio Natural -> Ratio Natural
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance (RealFloat a) => ASemigroup (Complex a) where
.+. :: Complex a -> Complex a -> Complex a
(.+.) = Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance (HasResolution k) => ASemigroup (Fixed k) where
.+. :: Fixed k -> Fixed k -> Fixed k
(.+.) = Fixed k -> Fixed k -> Fixed k
forall a. Num a => a -> a -> a
(+)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (a, a) where
(a
x1, a
x2) .+. :: (a, a) -> (a, a) -> (a, a)
.+. (a
y1, a
y2) = (a
x1 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y1, a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1, a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2, a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1,
a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2,
a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3,
a
x4 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y4
)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1,
a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2,
a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3,
a
x4 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y4,
a
x5 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y5
)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1,
a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2,
a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3,
a
x4 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y4,
a
x5 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y5,
a
x6 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y6
)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1,
a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2,
a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3,
a
x4 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y4,
a
x5 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y5,
a
x6 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y6,
a
x7 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y7
)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1,
a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2,
a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3,
a
x4 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y4,
a
x5 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y5,
a
x6 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y6,
a
x7 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y7,
a
x8 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y8
)
{-# INLINE (.+.) #-}
instance (ASemigroup a) => ASemigroup (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 s. ASemigroup s => s -> s -> s
.+. a
y1,
a
x2 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y2,
a
x3 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y3,
a
x4 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y4,
a
x5 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y5,
a
x6 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y6,
a
x7 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y7,
a
x8 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y8,
a
x9 a -> a -> a
forall s. ASemigroup s => s -> s -> s
.+. a
y9
)
{-# INLINE (.+.) #-}