{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_GHC -Wno-unused-imports #-}
module NumHask.Algebra.Multiplicative
( Multiplicative (..),
product,
accproduct,
Divisive (..),
)
where
import Data.Int (Int16, Int32, Int64, Int8)
import Data.Traversable (mapAccumL)
import Data.Word (Word, Word16, Word32, Word64, Word8)
import GHC.Natural (Natural (..))
import Prelude (Double, Float, Int, Integer, fromInteger, fromRational)
import qualified Prelude as P
class Multiplicative a where
infixl 7 *
(*) :: a -> a -> a
one :: a
product :: (Multiplicative a, P.Foldable f) => f a -> a
product :: f a -> a
product = (a -> a -> a) -> a -> f a -> a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
P.foldr a -> a -> a
forall a. Multiplicative a => a -> a -> a
(*) a
forall a. Multiplicative a => a
one
accproduct :: (Multiplicative a, P.Traversable f) => f a -> f a
accproduct :: f a -> f a
accproduct = (a, f a) -> f a
forall a b. (a, b) -> b
P.snd ((a, f a) -> f a) -> (f a -> (a, f a)) -> f a -> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
P.. (a -> a -> (a, a)) -> a -> f a -> (a, f a)
forall (t :: * -> *) a b c.
Traversable t =>
(a -> b -> (a, c)) -> a -> t b -> (a, t c)
mapAccumL (\a
a a
b -> (a
a a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
b, a
a a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
b)) a
forall a. Multiplicative a => a
one
class (Multiplicative a) => Divisive a where
recip :: a -> a
recip a
a = a
forall a. Multiplicative a => a
one a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
a
infixl 7 /
(/) :: a -> a -> a
(/) a
a a
b = a
a a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a -> a
forall a. Divisive a => a -> a
recip a
b
instance Multiplicative Double where
* :: Double -> Double -> Double
(*) = Double -> Double -> Double
forall a. Num a => a -> a -> a
(P.*)
one :: Double
one = Double
1.0
instance Divisive Double where
recip :: Double -> Double
recip = Double -> Double
forall a. Fractional a => a -> a
P.recip
instance Multiplicative Float where
* :: Float -> Float -> Float
(*) = Float -> Float -> Float
forall a. Num a => a -> a -> a
(P.*)
one :: Float
one = Float
1.0
instance Divisive Float where
recip :: Float -> Float
recip = Float -> Float
forall a. Fractional a => a -> a
P.recip
instance Multiplicative Int where
* :: Int -> Int -> Int
(*) = Int -> Int -> Int
forall a. Num a => a -> a -> a
(P.*)
one :: Int
one = Int
1
instance Multiplicative Integer where
* :: Integer -> Integer -> Integer
(*) = Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
(P.*)
one :: Integer
one = Integer
1
instance Multiplicative P.Bool where
* :: Bool -> Bool -> Bool
(*) = Bool -> Bool -> Bool
(P.&&)
one :: Bool
one = Bool
P.True
instance Multiplicative Natural where
* :: Natural -> Natural -> Natural
(*) = Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
(P.*)
one :: Natural
one = Natural
1
instance Multiplicative Int8 where
* :: Int8 -> Int8 -> Int8
(*) = Int8 -> Int8 -> Int8
forall a. Num a => a -> a -> a
(P.*)
one :: Int8
one = Int8
1
instance Multiplicative Int16 where
* :: Int16 -> Int16 -> Int16
(*) = Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
(P.*)
one :: Int16
one = Int16
1
instance Multiplicative Int32 where
* :: Int32 -> Int32 -> Int32
(*) = Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
(P.*)
one :: Int32
one = Int32
1
instance Multiplicative Int64 where
* :: Int64 -> Int64 -> Int64
(*) = Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
(P.*)
one :: Int64
one = Int64
1
instance Multiplicative Word where
* :: Word -> Word -> Word
(*) = Word -> Word -> Word
forall a. Num a => a -> a -> a
(P.*)
one :: Word
one = Word
1
instance Multiplicative Word8 where
* :: Word8 -> Word8 -> Word8
(*) = Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
(P.*)
one :: Word8
one = Word8
1
instance Multiplicative Word16 where
* :: Word16 -> Word16 -> Word16
(*) = Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
(P.*)
one :: Word16
one = Word16
1
instance Multiplicative Word32 where
* :: Word32 -> Word32 -> Word32
(*) = Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
(P.*)
one :: Word32
one = Word32
1
instance Multiplicative Word64 where
* :: Word64 -> Word64 -> Word64
(*) = Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
(P.*)
one :: Word64
one = Word64
1
instance Multiplicative b => Multiplicative (a -> b) where
a -> b
f * :: (a -> b) -> (a -> b) -> a -> b
* a -> b
f' = \a
a -> a -> b
f a
a b -> b -> b
forall a. Multiplicative a => a -> a -> a
* a -> b
f' a
a
one :: a -> b
one a
_ = b
forall a. Multiplicative a => a
one
instance Divisive b => Divisive (a -> b) where
recip :: (a -> b) -> a -> b
recip a -> b
f = b -> b
forall a. Divisive a => a -> a
recip (b -> b) -> (a -> b) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
P.. a -> b
f