{-# OPTIONS_GHC -Wall #-}
module NumHask.Algebra.Multiplicative
( Multiplicative (..),
product,
Divisive (..),
)
where
import Data.Int (Int16, Int32, Int64, Int8)
import Data.Word (Word, Word16, Word32, Word64, Word8)
import GHC.Natural (Natural (..))
import Prelude (Double, Float, Int, Integer)
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
class (Multiplicative a) => Divisive a where
recip :: 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