{-# LANGUAGE TypeFamilies #-}
module NumHask.Algebra.Action
( AdditiveAction (..),
(+|),
SubtractiveAction (..),
(-|),
MultiplicativeAction (..),
(*|),
DivisiveAction (..),
(/|),
Module,
TrivialAction (..),
)
where
import Data.Kind (Type)
import NumHask.Algebra.Additive (Additive (..), Subtractive (..))
import NumHask.Algebra.Multiplicative (Divisive (..), Multiplicative (..))
import NumHask.Algebra.Ring (Distributive)
import Prelude (Double, Eq, Float, Ord, flip)
class
(Additive (AdditiveScalar m)) =>
AdditiveAction m
where
type AdditiveScalar m :: Type
infixl 6 |+
(|+) :: m -> AdditiveScalar m -> m
infixl 6 +|
(+|) :: (AdditiveAction m) => AdditiveScalar m -> m -> m
+| :: forall m. AdditiveAction m => AdditiveScalar m -> m -> m
(+|) = (m -> AdditiveScalar m -> m) -> AdditiveScalar m -> m -> m
forall a b c. (a -> b -> c) -> b -> a -> c
flip m -> AdditiveScalar m -> m
forall m. AdditiveAction m => m -> AdditiveScalar m -> m
(|+)
class
(AdditiveAction m, Subtractive (AdditiveScalar m)) =>
SubtractiveAction m
where
infixl 6 |-
(|-) :: m -> AdditiveScalar m -> m
infixl 6 -|
(-|) :: (AdditiveAction m, Subtractive m) => AdditiveScalar m -> m -> m
AdditiveScalar m
a -| :: forall m.
(AdditiveAction m, Subtractive m) =>
AdditiveScalar m -> m -> m
-| m
b = AdditiveScalar m
a AdditiveScalar m -> m -> m
forall m. AdditiveAction m => AdditiveScalar m -> m -> m
+| m -> m
forall a. Subtractive a => a -> a
negate m
b
class
(Multiplicative (Scalar m)) =>
MultiplicativeAction m
where
type Scalar m :: Type
infixl 7 |*
(|*) :: m -> Scalar m -> m
infixl 7 *|
(*|) :: (MultiplicativeAction m) => Scalar m -> m -> m
*| :: forall m. MultiplicativeAction m => Scalar m -> m -> m
(*|) = (m -> Scalar m -> m) -> Scalar m -> m -> m
forall a b c. (a -> b -> c) -> b -> a -> c
flip m -> Scalar m -> m
forall m. MultiplicativeAction m => m -> Scalar m -> m
(|*)
class
(Divisive (Scalar m), MultiplicativeAction m) =>
DivisiveAction m
where
infixl 7 |/
(|/) :: m -> Scalar m -> m
(/|) :: (MultiplicativeAction m, Divisive m) => Scalar m -> m -> m
Scalar m
a /| :: forall m.
(MultiplicativeAction m, Divisive m) =>
Scalar m -> m -> m
/| m
b = Scalar m
a Scalar m -> m -> m
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| m -> m
forall a. Divisive a => a -> a
recip m
b
type Module m = (Distributive (Scalar m), MultiplicativeAction m)
instance MultiplicativeAction Double where
type Scalar Double = Double
|* :: Double -> Scalar Double -> Double
(|*) = Double -> Double -> Double
Double -> Scalar Double -> Double
forall a. Multiplicative a => a -> a -> a
(*)
instance DivisiveAction Double where
|/ :: Double -> Scalar Double -> Double
(|/) = Double -> Double -> Double
Double -> Scalar Double -> Double
forall a. Divisive a => a -> a -> a
(/)
instance MultiplicativeAction Float where
type Scalar Float = Float
|* :: Float -> Scalar Float -> Float
(|*) = Float -> Float -> Float
Float -> Scalar Float -> Float
forall a. Multiplicative a => a -> a -> a
(*)
instance DivisiveAction Float where
|/ :: Float -> Scalar Float -> Float
(|/) = Float -> Float -> Float
Float -> Scalar Float -> Float
forall a. Divisive a => a -> a -> a
(/)
newtype TrivialAction a = TrivialAction
{ forall a. TrivialAction a -> a
getTrivialAction :: a
}
deriving (TrivialAction a -> TrivialAction a -> Bool
(TrivialAction a -> TrivialAction a -> Bool)
-> (TrivialAction a -> TrivialAction a -> Bool)
-> Eq (TrivialAction a)
forall a. Eq a => TrivialAction a -> TrivialAction a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => TrivialAction a -> TrivialAction a -> Bool
== :: TrivialAction a -> TrivialAction a -> Bool
$c/= :: forall a. Eq a => TrivialAction a -> TrivialAction a -> Bool
/= :: TrivialAction a -> TrivialAction a -> Bool
Eq, Eq (TrivialAction a)
Eq (TrivialAction a) =>
(TrivialAction a -> TrivialAction a -> Ordering)
-> (TrivialAction a -> TrivialAction a -> Bool)
-> (TrivialAction a -> TrivialAction a -> Bool)
-> (TrivialAction a -> TrivialAction a -> Bool)
-> (TrivialAction a -> TrivialAction a -> Bool)
-> (TrivialAction a -> TrivialAction a -> TrivialAction a)
-> (TrivialAction a -> TrivialAction a -> TrivialAction a)
-> Ord (TrivialAction a)
TrivialAction a -> TrivialAction a -> Bool
TrivialAction a -> TrivialAction a -> Ordering
TrivialAction a -> TrivialAction a -> TrivialAction a
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 a. Ord a => Eq (TrivialAction a)
forall a. Ord a => TrivialAction a -> TrivialAction a -> Bool
forall a. Ord a => TrivialAction a -> TrivialAction a -> Ordering
forall a.
Ord a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
$ccompare :: forall a. Ord a => TrivialAction a -> TrivialAction a -> Ordering
compare :: TrivialAction a -> TrivialAction a -> Ordering
$c< :: forall a. Ord a => TrivialAction a -> TrivialAction a -> Bool
< :: TrivialAction a -> TrivialAction a -> Bool
$c<= :: forall a. Ord a => TrivialAction a -> TrivialAction a -> Bool
<= :: TrivialAction a -> TrivialAction a -> Bool
$c> :: forall a. Ord a => TrivialAction a -> TrivialAction a -> Bool
> :: TrivialAction a -> TrivialAction a -> Bool
$c>= :: forall a. Ord a => TrivialAction a -> TrivialAction a -> Bool
>= :: TrivialAction a -> TrivialAction a -> Bool
$cmax :: forall a.
Ord a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
max :: TrivialAction a -> TrivialAction a -> TrivialAction a
$cmin :: forall a.
Ord a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
min :: TrivialAction a -> TrivialAction a -> TrivialAction a
Ord, TrivialAction a
TrivialAction a -> TrivialAction a -> TrivialAction a
(TrivialAction a -> TrivialAction a -> TrivialAction a)
-> TrivialAction a -> Additive (TrivialAction a)
forall a. Additive a => TrivialAction a
forall a.
Additive a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
forall a. (a -> a -> a) -> a -> Additive a
$c+ :: forall a.
Additive a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
+ :: TrivialAction a -> TrivialAction a -> TrivialAction a
$czero :: forall a. Additive a => TrivialAction a
zero :: TrivialAction a
Additive, Additive (TrivialAction a)
Additive (TrivialAction a) =>
(TrivialAction a -> TrivialAction a)
-> (TrivialAction a -> TrivialAction a -> TrivialAction a)
-> Subtractive (TrivialAction a)
TrivialAction a -> TrivialAction a
TrivialAction a -> TrivialAction a -> TrivialAction a
forall a. Additive a => (a -> a) -> (a -> a -> a) -> Subtractive a
forall a. Subtractive a => Additive (TrivialAction a)
forall a. Subtractive a => TrivialAction a -> TrivialAction a
forall a.
Subtractive a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
$cnegate :: forall a. Subtractive a => TrivialAction a -> TrivialAction a
negate :: TrivialAction a -> TrivialAction a
$c- :: forall a.
Subtractive a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
- :: TrivialAction a -> TrivialAction a -> TrivialAction a
Subtractive, TrivialAction a
TrivialAction a -> TrivialAction a -> TrivialAction a
(TrivialAction a -> TrivialAction a -> TrivialAction a)
-> TrivialAction a -> Multiplicative (TrivialAction a)
forall a. Multiplicative a => TrivialAction a
forall a.
Multiplicative a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
forall a. (a -> a -> a) -> a -> Multiplicative a
$c* :: forall a.
Multiplicative a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
* :: TrivialAction a -> TrivialAction a -> TrivialAction a
$cone :: forall a. Multiplicative a => TrivialAction a
one :: TrivialAction a
Multiplicative, Multiplicative (TrivialAction a)
Multiplicative (TrivialAction a) =>
(TrivialAction a -> TrivialAction a)
-> (TrivialAction a -> TrivialAction a -> TrivialAction a)
-> Divisive (TrivialAction a)
TrivialAction a -> TrivialAction a
TrivialAction a -> TrivialAction a -> TrivialAction a
forall a. Divisive a => Multiplicative (TrivialAction a)
forall a. Divisive a => TrivialAction a -> TrivialAction a
forall a.
Divisive a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
forall a.
Multiplicative a =>
(a -> a) -> (a -> a -> a) -> Divisive a
$crecip :: forall a. Divisive a => TrivialAction a -> TrivialAction a
recip :: TrivialAction a -> TrivialAction a
$c/ :: forall a.
Divisive a =>
TrivialAction a -> TrivialAction a -> TrivialAction a
/ :: TrivialAction a -> TrivialAction a -> TrivialAction a
Divisive)
instance (Additive a) => AdditiveAction (TrivialAction a) where
type AdditiveScalar (TrivialAction a) = a
TrivialAction a
a |+ :: TrivialAction a
-> AdditiveScalar (TrivialAction a) -> TrivialAction a
|+ AdditiveScalar (TrivialAction a)
b = a -> TrivialAction a
forall a. a -> TrivialAction a
TrivialAction (a
a a -> a -> a
forall a. Additive a => a -> a -> a
+ a
AdditiveScalar (TrivialAction a)
b)
instance (Subtractive a) => SubtractiveAction (TrivialAction a) where
TrivialAction a
a |- :: TrivialAction a
-> AdditiveScalar (TrivialAction a) -> TrivialAction a
|- AdditiveScalar (TrivialAction a)
b = a -> TrivialAction a
forall a. a -> TrivialAction a
TrivialAction (a
a a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
AdditiveScalar (TrivialAction a)
b)
instance (Multiplicative a) => MultiplicativeAction (TrivialAction a) where
type Scalar (TrivialAction a) = a
TrivialAction a
a |* :: TrivialAction a -> Scalar (TrivialAction a) -> TrivialAction a
|* Scalar (TrivialAction a)
b = a -> TrivialAction a
forall a. a -> TrivialAction a
TrivialAction (a
a a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
Scalar (TrivialAction a)
b)
instance (Divisive a) => DivisiveAction (TrivialAction a) where
TrivialAction a
a |/ :: TrivialAction a -> Scalar (TrivialAction a) -> TrivialAction a
|/ Scalar (TrivialAction a)
b = a -> TrivialAction a
forall a. a -> TrivialAction a
TrivialAction (a
a a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
Scalar (TrivialAction a)
b)