{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}
module Algebra.Scalar (Scalar (..), (.*.)) where
import Algebra.Normed
import AlgebraicPrelude
import qualified Prelude as P
newtype Scalar r = Scalar {Scalar r -> r
runScalar :: r}
deriving
( ReadPrec [Scalar r]
ReadPrec (Scalar r)
Int -> ReadS (Scalar r)
ReadS [Scalar r]
(Int -> ReadS (Scalar r))
-> ReadS [Scalar r]
-> ReadPrec (Scalar r)
-> ReadPrec [Scalar r]
-> Read (Scalar r)
forall r. Read r => ReadPrec [Scalar r]
forall r. Read r => ReadPrec (Scalar r)
forall r. Read r => Int -> ReadS (Scalar r)
forall r. Read r => ReadS [Scalar r]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Scalar r]
$creadListPrec :: forall r. Read r => ReadPrec [Scalar r]
readPrec :: ReadPrec (Scalar r)
$creadPrec :: forall r. Read r => ReadPrec (Scalar r)
readList :: ReadS [Scalar r]
$creadList :: forall r. Read r => ReadS [Scalar r]
readsPrec :: Int -> ReadS (Scalar r)
$creadsPrec :: forall r. Read r => Int -> ReadS (Scalar r)
Read
, Int -> Scalar r -> ShowS
[Scalar r] -> ShowS
Scalar r -> String
(Int -> Scalar r -> ShowS)
-> (Scalar r -> String) -> ([Scalar r] -> ShowS) -> Show (Scalar r)
forall r. Show r => Int -> Scalar r -> ShowS
forall r. Show r => [Scalar r] -> ShowS
forall r. Show r => Scalar r -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Scalar r] -> ShowS
$cshowList :: forall r. Show r => [Scalar r] -> ShowS
show :: Scalar r -> String
$cshow :: forall r. Show r => Scalar r -> String
showsPrec :: Int -> Scalar r -> ShowS
$cshowsPrec :: forall r. Show r => Int -> Scalar r -> ShowS
Show
, Scalar r -> Scalar r -> Bool
(Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool) -> Eq (Scalar r)
forall r. Eq r => Scalar r -> Scalar r -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Scalar r -> Scalar r -> Bool
$c/= :: forall r. Eq r => Scalar r -> Scalar r -> Bool
== :: Scalar r -> Scalar r -> Bool
$c== :: forall r. Eq r => Scalar r -> Scalar r -> Bool
Eq
, Eq (Scalar r)
Eq (Scalar r)
-> (Scalar r -> Scalar r -> Ordering)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> Ord (Scalar r)
Scalar r -> Scalar r -> Bool
Scalar r -> Scalar r -> Ordering
Scalar r -> Scalar r -> Scalar r
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall r. Ord r => Eq (Scalar r)
forall r. Ord r => Scalar r -> Scalar r -> Bool
forall r. Ord r => Scalar r -> Scalar r -> Ordering
forall r. Ord r => Scalar r -> Scalar r -> Scalar r
min :: Scalar r -> Scalar r -> Scalar r
$cmin :: forall r. Ord r => Scalar r -> Scalar r -> Scalar r
max :: Scalar r -> Scalar r -> Scalar r
$cmax :: forall r. Ord r => Scalar r -> Scalar r -> Scalar r
>= :: Scalar r -> Scalar r -> Bool
$c>= :: forall r. Ord r => Scalar r -> Scalar r -> Bool
> :: Scalar r -> Scalar r -> Bool
$c> :: forall r. Ord r => Scalar r -> Scalar r -> Bool
<= :: Scalar r -> Scalar r -> Bool
$c<= :: forall r. Ord r => Scalar r -> Scalar r -> Bool
< :: Scalar r -> Scalar r -> Bool
$c< :: forall r. Ord r => Scalar r -> Scalar r -> Bool
compare :: Scalar r -> Scalar r -> Ordering
$ccompare :: forall r. Ord r => Scalar r -> Scalar r -> Ordering
$cp1Ord :: forall r. Ord r => Eq (Scalar r)
Ord
, Natural -> Scalar r -> Scalar r
Scalar r -> Scalar r -> Scalar r
(a -> Scalar r) -> f a -> Scalar r
(Scalar r -> Scalar r -> Scalar r)
-> (Natural -> Scalar r -> Scalar r)
-> (forall (f :: * -> *) a.
Foldable1 f =>
(a -> Scalar r) -> f a -> Scalar r)
-> Additive (Scalar r)
forall r. Additive r => Natural -> Scalar r -> Scalar r
forall r. Additive r => Scalar r -> Scalar r -> Scalar r
forall r (f :: * -> *) a.
(Additive r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
forall r.
(r -> r -> r)
-> (Natural -> r -> r)
-> (forall (f :: * -> *) a. Foldable1 f => (a -> r) -> f a -> r)
-> Additive r
forall (f :: * -> *) a.
Foldable1 f =>
(a -> Scalar r) -> f a -> Scalar r
sumWith1 :: (a -> Scalar r) -> f a -> Scalar r
$csumWith1 :: forall r (f :: * -> *) a.
(Additive r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
sinnum1p :: Natural -> Scalar r -> Scalar r
$csinnum1p :: forall r. Additive r => Natural -> Scalar r -> Scalar r
+ :: Scalar r -> Scalar r -> Scalar r
$c+ :: forall r. Additive r => Scalar r -> Scalar r -> Scalar r
Additive
, Enum (Scalar r)
Real (Scalar r)
Real (Scalar r)
-> Enum (Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> (Scalar r, Scalar r))
-> (Scalar r -> Scalar r -> (Scalar r, Scalar r))
-> (Scalar r -> Integer)
-> Integral (Scalar r)
Scalar r -> Integer
Scalar r -> Scalar r -> (Scalar r, Scalar r)
Scalar r -> Scalar r -> Scalar r
forall r. Integral r => Enum (Scalar r)
forall r. Integral r => Real (Scalar r)
forall r. Integral r => Scalar r -> Integer
forall r.
Integral r =>
Scalar r -> Scalar r -> (Scalar r, Scalar r)
forall r. Integral r => Scalar r -> Scalar r -> Scalar r
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: Scalar r -> Integer
$ctoInteger :: forall r. Integral r => Scalar r -> Integer
divMod :: Scalar r -> Scalar r -> (Scalar r, Scalar r)
$cdivMod :: forall r.
Integral r =>
Scalar r -> Scalar r -> (Scalar r, Scalar r)
quotRem :: Scalar r -> Scalar r -> (Scalar r, Scalar r)
$cquotRem :: forall r.
Integral r =>
Scalar r -> Scalar r -> (Scalar r, Scalar r)
mod :: Scalar r -> Scalar r -> Scalar r
$cmod :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
div :: Scalar r -> Scalar r -> Scalar r
$cdiv :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
rem :: Scalar r -> Scalar r -> Scalar r
$crem :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
quot :: Scalar r -> Scalar r -> Scalar r
$cquot :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
$cp2Integral :: forall r. Integral r => Enum (Scalar r)
$cp1Integral :: forall r. Integral r => Real (Scalar r)
Integral
, Num (Scalar r)
Ord (Scalar r)
Num (Scalar r)
-> Ord (Scalar r) -> (Scalar r -> Rational) -> Real (Scalar r)
Scalar r -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
forall r. Real r => Num (Scalar r)
forall r. Real r => Ord (Scalar r)
forall r. Real r => Scalar r -> Rational
toRational :: Scalar r -> Rational
$ctoRational :: forall r. Real r => Scalar r -> Rational
$cp2Real :: forall r. Real r => Ord (Scalar r)
$cp1Real :: forall r. Real r => Num (Scalar r)
Real
, Int -> Scalar r
Scalar r -> Int
Scalar r -> [Scalar r]
Scalar r -> Scalar r
Scalar r -> Scalar r -> [Scalar r]
Scalar r -> Scalar r -> Scalar r -> [Scalar r]
(Scalar r -> Scalar r)
-> (Scalar r -> Scalar r)
-> (Int -> Scalar r)
-> (Scalar r -> Int)
-> (Scalar r -> [Scalar r])
-> (Scalar r -> Scalar r -> [Scalar r])
-> (Scalar r -> Scalar r -> [Scalar r])
-> (Scalar r -> Scalar r -> Scalar r -> [Scalar r])
-> Enum (Scalar r)
forall r. Enum r => Int -> Scalar r
forall r. Enum r => Scalar r -> Int
forall r. Enum r => Scalar r -> [Scalar r]
forall r. Enum r => Scalar r -> Scalar r
forall r. Enum r => Scalar r -> Scalar r -> [Scalar r]
forall r. Enum r => Scalar r -> Scalar r -> Scalar r -> [Scalar r]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Scalar r -> Scalar r -> Scalar r -> [Scalar r]
$cenumFromThenTo :: forall r. Enum r => Scalar r -> Scalar r -> Scalar r -> [Scalar r]
enumFromTo :: Scalar r -> Scalar r -> [Scalar r]
$cenumFromTo :: forall r. Enum r => Scalar r -> Scalar r -> [Scalar r]
enumFromThen :: Scalar r -> Scalar r -> [Scalar r]
$cenumFromThen :: forall r. Enum r => Scalar r -> Scalar r -> [Scalar r]
enumFrom :: Scalar r -> [Scalar r]
$cenumFrom :: forall r. Enum r => Scalar r -> [Scalar r]
fromEnum :: Scalar r -> Int
$cfromEnum :: forall r. Enum r => Scalar r -> Int
toEnum :: Int -> Scalar r
$ctoEnum :: forall r. Enum r => Int -> Scalar r
pred :: Scalar r -> Scalar r
$cpred :: forall r. Enum r => Scalar r -> Scalar r
succ :: Scalar r -> Scalar r
$csucc :: forall r. Enum r => Scalar r -> Scalar r
Enum
, Scalar r -> Natural -> Scalar r
Scalar r -> Scalar r -> Scalar r
(a -> Scalar r) -> f a -> Scalar r
(Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Natural -> Scalar r)
-> (forall (f :: * -> *) a.
Foldable1 f =>
(a -> Scalar r) -> f a -> Scalar r)
-> Multiplicative (Scalar r)
forall r. Multiplicative r => Scalar r -> Natural -> Scalar r
forall r. Multiplicative r => Scalar r -> Scalar r -> Scalar r
forall r (f :: * -> *) a.
(Multiplicative r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
forall r.
(r -> r -> r)
-> (r -> Natural -> r)
-> (forall (f :: * -> *) a. Foldable1 f => (a -> r) -> f a -> r)
-> Multiplicative r
forall (f :: * -> *) a.
Foldable1 f =>
(a -> Scalar r) -> f a -> Scalar r
productWith1 :: (a -> Scalar r) -> f a -> Scalar r
$cproductWith1 :: forall r (f :: * -> *) a.
(Multiplicative r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
pow1p :: Scalar r -> Natural -> Scalar r
$cpow1p :: forall r. Multiplicative r => Scalar r -> Natural -> Scalar r
* :: Scalar r -> Scalar r -> Scalar r
$c* :: forall r. Multiplicative r => Scalar r -> Scalar r -> Scalar r
Multiplicative
, Multiplicative (Scalar r)
Scalar r
Multiplicative (Scalar r)
-> Scalar r
-> (Scalar r -> Natural -> Scalar r)
-> (forall (f :: * -> *) a.
Foldable f =>
(a -> Scalar r) -> f a -> Scalar r)
-> Unital (Scalar r)
Scalar r -> Natural -> Scalar r
(a -> Scalar r) -> f a -> Scalar r
forall r. Unital r => Multiplicative (Scalar r)
forall r. Unital r => Scalar r
forall r. Unital r => Scalar r -> Natural -> Scalar r
forall r (f :: * -> *) a.
(Unital r, Foldable f) =>
(a -> Scalar r) -> f a -> Scalar r
forall r.
Multiplicative r
-> r
-> (r -> Natural -> r)
-> (forall (f :: * -> *) a. Foldable f => (a -> r) -> f a -> r)
-> Unital r
forall (f :: * -> *) a.
Foldable f =>
(a -> Scalar r) -> f a -> Scalar r
productWith :: (a -> Scalar r) -> f a -> Scalar r
$cproductWith :: forall r (f :: * -> *) a.
(Unital r, Foldable f) =>
(a -> Scalar r) -> f a -> Scalar r
pow :: Scalar r -> Natural -> Scalar r
$cpow :: forall r. Unital r => Scalar r -> Natural -> Scalar r
one :: Scalar r
$cone :: forall r. Unital r => Scalar r
$cp1Unital :: forall r. Unital r => Multiplicative (Scalar r)
Unital
)
(.*.) ::
(Module (Scalar r) m) =>
r ->
m ->
m
r
r .*. :: r -> m -> m
.*. m
f = r -> Scalar r
forall r. r -> Scalar r
Scalar r
r Scalar r -> m -> m
forall r m. LeftModule r m => r -> m -> m
.* m
f
infixr 8 .*.
instance Normed r => Normed (Scalar r) where
type Norm (Scalar r) = Norm r
norm :: Scalar r -> Norm (Scalar r)
norm = r -> Norm r
forall a. Normed a => a -> Norm a
norm (r -> Norm r) -> (Scalar r -> r) -> Scalar r -> Norm r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scalar r -> r
forall r. Scalar r -> r
runScalar
liftNorm :: Norm (Scalar r) -> Scalar r
liftNorm = Scalar (Scalar r) -> Scalar r
forall r. Scalar r -> r
runScalar (Scalar (Scalar r) -> Scalar r)
-> (Norm r -> Scalar (Scalar r)) -> Norm r -> Scalar r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Norm r -> Scalar (Scalar r)
forall a. Normed a => Norm a -> a
liftNorm
deriving instance DecidableAssociates r => DecidableAssociates (Scalar r)
deriving instance DecidableUnits r => DecidableUnits (Scalar r)
deriving instance UnitNormalForm r => UnitNormalForm (Scalar r)
deriving instance P.Num r => P.Num (Scalar r)
deriving instance P.Fractional r => P.Fractional (Scalar r)
deriving instance Monoidal r => Monoidal (Scalar r)
deriving instance Group r => Group (Scalar r)
deriving instance Semiring r => Semiring (Scalar r)
deriving instance Ring r => Ring (Scalar r)
deriving instance Abelian r => Abelian (Scalar r)
deriving instance Rig r => Rig (Scalar r)
deriving instance Commutative r => Commutative (Scalar r)
deriving instance Division r => Division (Scalar r)
deriving instance LeftModule Integer r => LeftModule Integer (Scalar r)
deriving instance RightModule Integer r => RightModule Integer (Scalar r)
deriving instance LeftModule Natural r => LeftModule Natural (Scalar r)
deriving instance RightModule Natural r => RightModule Natural (Scalar r)
instance Semiring r => RightModule r (Scalar r) where
Scalar r
r *. :: Scalar r -> r -> Scalar r
*. r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q
{-# INLINE (*.) #-}
instance Semiring r => LeftModule r (Scalar r) where
r
r .* :: r -> Scalar r -> Scalar r
.* Scalar r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q
{-# INLINE (.*) #-}
instance (Semiring r) => LeftModule (Scalar r) (Scalar r) where
Scalar r
r .* :: Scalar r -> Scalar r -> Scalar r
.* Scalar r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q
instance (Semiring r) => RightModule (Scalar r) (Scalar r) where
Scalar r
r *. :: Scalar r -> Scalar r -> Scalar r
*. Scalar r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q