{-# LANGUAGE NoMonomorphismRestriction #-}
{-# OPTIONS_HADDOCK prune #-}
module Math.Algebras.VectorSpace where
import Prelude hiding ( (<*), (*>) )
import Control.Applicative hiding ( (<*), (*>) )
import Control.Monad (ap)
import qualified Data.List as L
import qualified Data.Set as S
infixr 7 *>
infixl 7 <*
infixl 6 <+>, <->, <<+>>, <<->>
newtype Vect k b = V [(b,k)] deriving (Vect k b -> Vect k b -> Bool
(Vect k b -> Vect k b -> Bool)
-> (Vect k b -> Vect k b -> Bool) -> Eq (Vect k b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k b. (Eq b, Eq k) => Vect k b -> Vect k b -> Bool
/= :: Vect k b -> Vect k b -> Bool
$c/= :: forall k b. (Eq b, Eq k) => Vect k b -> Vect k b -> Bool
== :: Vect k b -> Vect k b -> Bool
$c== :: forall k b. (Eq b, Eq k) => Vect k b -> Vect k b -> Bool
Eq,Eq (Vect k b)
Eq (Vect k b) =>
(Vect k b -> Vect k b -> Ordering)
-> (Vect k b -> Vect k b -> Bool)
-> (Vect k b -> Vect k b -> Bool)
-> (Vect k b -> Vect k b -> Bool)
-> (Vect k b -> Vect k b -> Bool)
-> (Vect k b -> Vect k b -> Vect k b)
-> (Vect k b -> Vect k b -> Vect k b)
-> Ord (Vect k b)
Vect k b -> Vect k b -> Bool
Vect k b -> Vect k b -> Ordering
Vect k b -> Vect k b -> Vect k b
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 k b. (Ord b, Ord k) => Eq (Vect k b)
forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Bool
forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Ordering
forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Vect k b
min :: Vect k b -> Vect k b -> Vect k b
$cmin :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Vect k b
max :: Vect k b -> Vect k b -> Vect k b
$cmax :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Vect k b
>= :: Vect k b -> Vect k b -> Bool
$c>= :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Bool
> :: Vect k b -> Vect k b -> Bool
$c> :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Bool
<= :: Vect k b -> Vect k b -> Bool
$c<= :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Bool
< :: Vect k b -> Vect k b -> Bool
$c< :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Bool
compare :: Vect k b -> Vect k b -> Ordering
$ccompare :: forall k b. (Ord b, Ord k) => Vect k b -> Vect k b -> Ordering
$cp1Ord :: forall k b. (Ord b, Ord k) => Eq (Vect k b)
Ord)
instance (Show k, Eq k, Num k, Show b) => Show (Vect k b) where
show :: Vect k b -> String
show (V []) = "0"
show (V ts :: [(b, k)]
ts) = [String] -> String
concatWithPlus ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ ((b, k) -> String) -> [(b, k)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (b, k) -> String
forall a a. (Show a, Show a) => (a, a) -> String
showTerm [(b, k)]
ts
where showTerm :: (a, a) -> String
showTerm (b :: a
b,x :: a
x) | a -> String
forall a. Show a => a -> String
show a
b String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "1" = a -> String
forall a. Show a => a -> String
show a
x
| a -> String
forall a. Show a => a -> String
show a
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "1" = a -> String
forall a. Show a => a -> String
show a
b
| a -> String
forall a. Show a => a -> String
show a
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "-1" = "-" String -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
b
| Bool
otherwise = (if String -> Bool
isAtomic (a -> String
forall a. Show a => a -> String
show a
x) then a -> String
forall a. Show a => a -> String
show a
x else "(" String -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ ")") String -> ShowS
forall a. [a] -> [a] -> [a]
++
a -> String
forall a. Show a => a -> String
show a
b
concatWithPlus :: [String] -> String
concatWithPlus (t1 :: String
t1:t2 :: String
t2:ts :: [String]
ts) = if String -> Char
forall a. [a] -> a
head String
t2 Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '-'
then String
t1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
concatWithPlus (String
t2String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
ts)
else String
t1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ '+' Char -> ShowS
forall a. a -> [a] -> [a]
: [String] -> String
concatWithPlus (String
t2String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
ts)
concatWithPlus [t :: String
t] = String
t
isAtomic :: String -> Bool
isAtomic (c :: Char
c:cs :: String
cs) = String -> Bool
isAtomic' String
cs
isAtomic' :: String -> Bool
isAtomic' ('^':'-':cs :: String
cs) = String -> Bool
isAtomic' String
cs
isAtomic' ('+':cs :: String
cs) = Bool
False
isAtomic' ('-':cs :: String
cs) = Bool
False
isAtomic' (c :: Char
c:cs :: String
cs) = String -> Bool
isAtomic' String
cs
isAtomic' [] = Bool
True
terms :: Vect k b -> [(b, k)]
terms (V ts :: [(b, k)]
ts) = [(b, k)]
ts
coeff :: (Num k, Eq b) => b -> Vect k b -> k
coeff :: b -> Vect k b -> k
coeff b :: b
b v :: Vect k b
v = [k] -> k
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [k
k | (b' :: b
b',k :: k
k) <- Vect k b -> [(b, k)]
forall k b. Vect k b -> [(b, k)]
terms Vect k b
v, b
b' b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== b
b]
removeTerm :: (Eq k, Num k, Ord b) => b -> Vect k b -> Vect k b
removeTerm :: b -> Vect k b -> Vect k b
removeTerm b :: b
b (V ts :: [(b, k)]
ts) = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V ([(b, k)] -> Vect k b) -> [(b, k)] -> Vect k b
forall a b. (a -> b) -> a -> b
$ ((b, k) -> Bool) -> [(b, k)] -> [(b, k)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((b -> b -> Bool
forall a. Eq a => a -> a -> Bool
/=b
b) (b -> Bool) -> ((b, k) -> b) -> (b, k) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b, k) -> b
forall a b. (a, b) -> a
fst) [(b, k)]
ts
zerov :: Vect k b
zerov :: Vect k b
zerov = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V []
add :: (Eq k, Num k, Ord b) => Vect k b -> Vect k b -> Vect k b
add :: Vect k b -> Vect k b -> Vect k b
add (V ts :: [(b, k)]
ts) (V us :: [(b, k)]
us) = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V ([(b, k)] -> Vect k b) -> [(b, k)] -> Vect k b
forall a b. (a -> b) -> a -> b
$ [(b, k)] -> [(b, k)] -> [(b, k)]
forall a b.
(Ord a, Num b, Eq b) =>
[(a, b)] -> [(a, b)] -> [(a, b)]
addmerge [(b, k)]
ts [(b, k)]
us
(<+>) :: (Eq k, Num k, Ord b) => Vect k b -> Vect k b -> Vect k b
<+> :: Vect k b -> Vect k b -> Vect k b
(<+>) = Vect k b -> Vect k b -> Vect k b
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
add
addmerge :: [(a, b)] -> [(a, b)] -> [(a, b)]
addmerge ((a :: a
a,x :: b
x):ts :: [(a, b)]
ts) ((b :: a
b,y :: b
y):us :: [(a, b)]
us) =
case a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
a a
b of
LT -> (a
a,b
x) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [(a, b)] -> [(a, b)] -> [(a, b)]
addmerge [(a, b)]
ts ((a
b,b
y)(a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
:[(a, b)]
us)
EQ -> if b
xb -> b -> b
forall a. Num a => a -> a -> a
+b
y b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== 0 then [(a, b)] -> [(a, b)] -> [(a, b)]
addmerge [(a, b)]
ts [(a, b)]
us else (a
a,b
xb -> b -> b
forall a. Num a => a -> a -> a
+b
y) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [(a, b)] -> [(a, b)] -> [(a, b)]
addmerge [(a, b)]
ts [(a, b)]
us
GT -> (a
b,b
y) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [(a, b)] -> [(a, b)] -> [(a, b)]
addmerge ((a
a,b
x)(a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
:[(a, b)]
ts) [(a, b)]
us
addmerge ts :: [(a, b)]
ts [] = [(a, b)]
ts
addmerge [] us :: [(a, b)]
us = [(a, b)]
us
sumv :: (Eq k, Num k, Ord b) => [Vect k b] -> Vect k b
sumv :: [Vect k b] -> Vect k b
sumv = (Vect k b -> Vect k b -> Vect k b)
-> Vect k b -> [Vect k b] -> Vect k b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Vect k b -> Vect k b -> Vect k b
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
(<+>) Vect k b
forall k b. Vect k b
zerov
negatev :: (Eq k, Num k) => Vect k b -> Vect k b
negatev :: Vect k b -> Vect k b
negatev (V ts :: [(b, k)]
ts) = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V ([(b, k)] -> Vect k b) -> [(b, k)] -> Vect k b
forall a b. (a -> b) -> a -> b
$ ((b, k) -> (b, k)) -> [(b, k)] -> [(b, k)]
forall a b. (a -> b) -> [a] -> [b]
map (\(b :: b
b,x :: k
x) -> (b
b,-k
x)) [(b, k)]
ts
(<->) :: (Eq k, Num k, Ord b) => Vect k b -> Vect k b -> Vect k b
<-> :: Vect k b -> Vect k b -> Vect k b
(<->) u :: Vect k b
u v :: Vect k b
v = Vect k b
u Vect k b -> Vect k b -> Vect k b
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> Vect k b -> Vect k b
forall k b. (Eq k, Num k) => Vect k b -> Vect k b
negatev Vect k b
v
smultL :: (Eq k, Num k) => k -> Vect k b -> Vect k b
smultL :: k -> Vect k b -> Vect k b
smultL 0 _ = Vect k b
forall k b. Vect k b
zerov
smultL k :: k
k (V ts :: [(b, k)]
ts) = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V [(b
ei,k
kk -> k -> k
forall a. Num a => a -> a -> a
*k
xi) | (ei :: b
ei,xi :: k
xi) <- [(b, k)]
ts]
(*>) :: (Eq k, Num k) => k -> Vect k b -> Vect k b
*> :: k -> Vect k b -> Vect k b
(*>) = k -> Vect k b -> Vect k b
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
smultL
smultR :: (Eq k, Num k) => Vect k b -> k -> Vect k b
smultR :: Vect k b -> k -> Vect k b
smultR _ 0 = Vect k b
forall k b. Vect k b
zerov
smultR (V ts :: [(b, k)]
ts) k :: k
k = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V [(b
ei,k
xik -> k -> k
forall a. Num a => a -> a -> a
*k
k) | (ei :: b
ei,xi :: k
xi) <- [(b, k)]
ts]
(<*) :: (Eq k, Num k) => Vect k b -> k -> Vect k b
<* :: Vect k b -> k -> Vect k b
(<*) = Vect k b -> k -> Vect k b
forall k b. (Eq k, Num k) => Vect k b -> k -> Vect k b
smultR
nf :: (Eq k, Num k, Ord b) => Vect k b -> Vect k b
nf :: Vect k b -> Vect k b
nf (V ts :: [(b, k)]
ts) = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V ([(b, k)] -> Vect k b) -> [(b, k)] -> Vect k b
forall a b. (a -> b) -> a -> b
$ [(b, k)] -> [(b, k)]
forall a a. (Ord a, Num a, Eq a) => [(a, a)] -> [(a, a)]
nf' ([(b, k)] -> [(b, k)]) -> [(b, k)] -> [(b, k)]
forall a b. (a -> b) -> a -> b
$ ((b, k) -> (b, k) -> Ordering) -> [(b, k)] -> [(b, k)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
L.sortBy (b, k) -> (b, k) -> Ordering
forall a b b. Ord a => (a, b) -> (a, b) -> Ordering
compareFst [(b, k)]
ts where
nf' :: [(a, a)] -> [(a, a)]
nf' ((b1 :: a
b1,x1 :: a
x1):(b2 :: a
b2,x2 :: a
x2):ts :: [(a, a)]
ts) =
case a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
b1 a
b2 of
LT -> if a
x1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== 0 then [(a, a)] -> [(a, a)]
nf' ((a
b2,a
x2)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a, a)]
ts) else (a
b1,a
x1) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)]
nf' ((a
b2,a
x2)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a, a)]
ts)
EQ -> if a
x1a -> a -> a
forall a. Num a => a -> a -> a
+a
x2 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== 0 then [(a, a)] -> [(a, a)]
nf' [(a, a)]
ts else [(a, a)] -> [(a, a)]
nf' ((a
b1,a
x1a -> a -> a
forall a. Num a => a -> a -> a
+a
x2)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a, a)]
ts)
GT -> String -> [(a, a)]
forall a. HasCallStack => String -> a
error "nf': not pre-sorted"
nf' [(b :: a
b,x :: a
x)] = if a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== 0 then [] else [(a
b,a
x)]
nf' [] = []
compareFst :: (a, b) -> (a, b) -> Ordering
compareFst (b1 :: a
b1,x1 :: b
x1) (b2 :: a
b2,x2 :: b
x2) = a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
b1 a
b2
instance Functor (Vect k) where
fmap :: (a -> b) -> Vect k a -> Vect k b
fmap f :: a -> b
f (V ts :: [(a, k)]
ts) = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V [(a -> b
f a
b, k
x) | (b :: a
b,x :: k
x) <- [(a, k)]
ts]
instance Num k => Applicative (Vect k) where
pure :: a -> Vect k a
pure = a -> Vect k a
forall (m :: * -> *) a. Monad m => a -> m a
return
<*> :: Vect k (a -> b) -> Vect k a -> Vect k b
(<*>) = Vect k (a -> b) -> Vect k a -> Vect k b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
instance Num k => Monad (Vect k) where
return :: a -> Vect k a
return a :: a
a = [(a, k)] -> Vect k a
forall k b. [(b, k)] -> Vect k b
V [(a
a,1)]
V ts :: [(a, k)]
ts >>= :: Vect k a -> (a -> Vect k b) -> Vect k b
>>= f :: a -> Vect k b
f = [(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V ([(b, k)] -> Vect k b) -> [(b, k)] -> Vect k b
forall a b. (a -> b) -> a -> b
$ [ (b
b,k
yk -> k -> k
forall a. Num a => a -> a -> a
*k
x) | (a :: a
a,x :: k
x) <- [(a, k)]
ts, let V us :: [(b, k)]
us = a -> Vect k b
f a
a, (b :: b
b,y :: k
y) <- [(b, k)]
us]
linear :: (Eq k, Num k, Ord b) => (a -> Vect k b) -> Vect k a -> Vect k b
linear :: (a -> Vect k b) -> Vect k a -> Vect k b
linear f :: a -> Vect k b
f v :: Vect k a
v = Vect k b -> Vect k b
forall k b. (Eq k, Num k, Ord b) => Vect k b -> Vect k b
nf (Vect k b -> Vect k b) -> Vect k b -> Vect k b
forall a b. (a -> b) -> a -> b
$ Vect k a
v Vect k a -> (a -> Vect k b) -> Vect k b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> Vect k b
f
newtype EBasis = E Int deriving (EBasis -> EBasis -> Bool
(EBasis -> EBasis -> Bool)
-> (EBasis -> EBasis -> Bool) -> Eq EBasis
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EBasis -> EBasis -> Bool
$c/= :: EBasis -> EBasis -> Bool
== :: EBasis -> EBasis -> Bool
$c== :: EBasis -> EBasis -> Bool
Eq,Eq EBasis
Eq EBasis =>
(EBasis -> EBasis -> Ordering)
-> (EBasis -> EBasis -> Bool)
-> (EBasis -> EBasis -> Bool)
-> (EBasis -> EBasis -> Bool)
-> (EBasis -> EBasis -> Bool)
-> (EBasis -> EBasis -> EBasis)
-> (EBasis -> EBasis -> EBasis)
-> Ord EBasis
EBasis -> EBasis -> Bool
EBasis -> EBasis -> Ordering
EBasis -> EBasis -> EBasis
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
min :: EBasis -> EBasis -> EBasis
$cmin :: EBasis -> EBasis -> EBasis
max :: EBasis -> EBasis -> EBasis
$cmax :: EBasis -> EBasis -> EBasis
>= :: EBasis -> EBasis -> Bool
$c>= :: EBasis -> EBasis -> Bool
> :: EBasis -> EBasis -> Bool
$c> :: EBasis -> EBasis -> Bool
<= :: EBasis -> EBasis -> Bool
$c<= :: EBasis -> EBasis -> Bool
< :: EBasis -> EBasis -> Bool
$c< :: EBasis -> EBasis -> Bool
compare :: EBasis -> EBasis -> Ordering
$ccompare :: EBasis -> EBasis -> Ordering
$cp1Ord :: Eq EBasis
Ord)
instance Show EBasis where show :: EBasis -> String
show (E i :: Int
i) = "e" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i
e :: Int -> m EBasis
e i :: Int
i = EBasis -> m EBasis
forall (m :: * -> *) a. Monad m => a -> m a
return (EBasis -> m EBasis) -> EBasis -> m EBasis
forall a b. (a -> b) -> a -> b
$ Int -> EBasis
E Int
i
e1 :: m EBasis
e1 = Int -> m EBasis
forall (m :: * -> *). Monad m => Int -> m EBasis
e 1
e2 :: m EBasis
e2 = Int -> m EBasis
forall (m :: * -> *). Monad m => Int -> m EBasis
e 2
e3 :: m EBasis
e3 = Int -> m EBasis
forall (m :: * -> *). Monad m => Int -> m EBasis
e 3
type Trivial k = Vect k ()
wrap :: (Eq k, Num k) => k -> Vect k ()
wrap :: k -> Vect k ()
wrap 0 = Vect k ()
forall k b. Vect k b
zerov
wrap x :: k
x = [((), k)] -> Vect k ()
forall k b. [(b, k)] -> Vect k b
V [( (),k
x)]
unwrap :: Num k => Vect k () -> k
unwrap :: Vect k () -> k
unwrap (V []) = 0
unwrap (V [( (),x :: k
x)]) = k
x
newtype Dual b = Dual b deriving (Dual b -> Dual b -> Bool
(Dual b -> Dual b -> Bool)
-> (Dual b -> Dual b -> Bool) -> Eq (Dual b)
forall b. Eq b => Dual b -> Dual b -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Dual b -> Dual b -> Bool
$c/= :: forall b. Eq b => Dual b -> Dual b -> Bool
== :: Dual b -> Dual b -> Bool
$c== :: forall b. Eq b => Dual b -> Dual b -> Bool
Eq,Eq (Dual b)
Eq (Dual b) =>
(Dual b -> Dual b -> Ordering)
-> (Dual b -> Dual b -> Bool)
-> (Dual b -> Dual b -> Bool)
-> (Dual b -> Dual b -> Bool)
-> (Dual b -> Dual b -> Bool)
-> (Dual b -> Dual b -> Dual b)
-> (Dual b -> Dual b -> Dual b)
-> Ord (Dual b)
Dual b -> Dual b -> Bool
Dual b -> Dual b -> Ordering
Dual b -> Dual b -> Dual b
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 b. Ord b => Eq (Dual b)
forall b. Ord b => Dual b -> Dual b -> Bool
forall b. Ord b => Dual b -> Dual b -> Ordering
forall b. Ord b => Dual b -> Dual b -> Dual b
min :: Dual b -> Dual b -> Dual b
$cmin :: forall b. Ord b => Dual b -> Dual b -> Dual b
max :: Dual b -> Dual b -> Dual b
$cmax :: forall b. Ord b => Dual b -> Dual b -> Dual b
>= :: Dual b -> Dual b -> Bool
$c>= :: forall b. Ord b => Dual b -> Dual b -> Bool
> :: Dual b -> Dual b -> Bool
$c> :: forall b. Ord b => Dual b -> Dual b -> Bool
<= :: Dual b -> Dual b -> Bool
$c<= :: forall b. Ord b => Dual b -> Dual b -> Bool
< :: Dual b -> Dual b -> Bool
$c< :: forall b. Ord b => Dual b -> Dual b -> Bool
compare :: Dual b -> Dual b -> Ordering
$ccompare :: forall b. Ord b => Dual b -> Dual b -> Ordering
$cp1Ord :: forall b. Ord b => Eq (Dual b)
Ord)
instance Show basis => Show (Dual basis) where
show :: Dual basis -> String
show (Dual b :: basis
b) = basis -> String
forall a. Show a => a -> String
show basis
b String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'"
e' :: Int -> m (Dual EBasis)
e' i :: Int
i = Dual EBasis -> m (Dual EBasis)
forall (m :: * -> *) a. Monad m => a -> m a
return (Dual EBasis -> m (Dual EBasis)) -> Dual EBasis -> m (Dual EBasis)
forall a b. (a -> b) -> a -> b
$ EBasis -> Dual EBasis
forall b. b -> Dual b
Dual (EBasis -> Dual EBasis) -> EBasis -> Dual EBasis
forall a b. (a -> b) -> a -> b
$ Int -> EBasis
E Int
i
e1' :: m (Dual EBasis)
e1' = Int -> m (Dual EBasis)
forall (m :: * -> *). Monad m => Int -> m (Dual EBasis)
e' 1
e2' :: m (Dual EBasis)
e2' = Int -> m (Dual EBasis)
forall (m :: * -> *). Monad m => Int -> m (Dual EBasis)
e' 2
e3' :: m (Dual EBasis)
e3' = Int -> m (Dual EBasis)
forall (m :: * -> *). Monad m => Int -> m (Dual EBasis)
e' 3
dual :: Vect k b -> Vect k (Dual b)
dual :: Vect k b -> Vect k (Dual b)
dual = (b -> Dual b) -> Vect k b -> Vect k (Dual b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> Dual b
forall b. b -> Dual b
Dual
(f :: t -> Vect k b
f <<+>> :: (t -> Vect k b) -> (t -> Vect k b) -> t -> Vect k b
<<+>> g :: t -> Vect k b
g) v :: t
v = t -> Vect k b
f t
v Vect k b -> Vect k b -> Vect k b
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> t -> Vect k b
g t
v
(f :: t -> Vect k b
f <<->> :: (t -> Vect k b) -> (t -> Vect k b) -> t -> Vect k b
<<->> g :: t -> Vect k b
g) v :: t
v = t -> Vect k b
f t
v Vect k b -> Vect k b -> Vect k b
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<-> t -> Vect k b
g t
v
zerof :: p -> Vect k b
zerof v :: p
v = Vect k b
forall k b. Vect k b
zerov
sumf :: t (t -> Vect k b) -> t -> Vect k b
sumf fs :: t (t -> Vect k b)
fs = ((t -> Vect k b) -> (t -> Vect k b) -> t -> Vect k b)
-> (t -> Vect k b) -> t (t -> Vect k b) -> t -> Vect k b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (t -> Vect k b) -> (t -> Vect k b) -> t -> Vect k b
forall k b t.
(Num k, Ord b, Eq k) =>
(t -> Vect k b) -> (t -> Vect k b) -> t -> Vect k b
(<<+>>) t -> Vect k b
forall p k b. p -> Vect k b
zerof t (t -> Vect k b)
fs
coeffLens :: (Ord b, Eq k, Num k, Functor f) => b -> (k -> f k) -> (Vect k b -> f (Vect k b))
coeffLens :: b -> (k -> f k) -> Vect k b -> f (Vect k b)
coeffLens b :: b
b = (Vect k b -> k)
-> (Vect k b -> k -> Vect k b)
-> (k -> f k)
-> Vect k b
-> f (Vect k b)
forall (f :: * -> *) t t a b.
Functor f =>
(t -> t) -> (t -> a -> b) -> (t -> f a) -> t -> f b
lens (b -> Vect k b -> k
forall k b. (Num k, Eq b) => b -> Vect k b -> k
coeff b
b) (b -> Vect k b -> k -> Vect k b
forall k b. (Num k, Ord b, Eq k) => b -> Vect k b -> k -> Vect k b
setter b
b)
where setter :: b -> Vect k b -> k -> Vect k b
setter b :: b
b = \(V ts :: [(b, k)]
ts) k :: k
k -> (k
k k -> Vect k b -> Vect k b
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> b -> Vect k b
forall (m :: * -> *) a. Monad m => a -> m a
return b
b) Vect k b -> Vect k b -> Vect k b
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> ([(b, k)] -> Vect k b
forall k b. [(b, k)] -> Vect k b
V ([(b, k)] -> Vect k b) -> [(b, k)] -> Vect k b
forall a b. (a -> b) -> a -> b
$ ((b, k) -> Bool) -> [(b, k)] -> [(b, k)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((b -> b -> Bool
forall a. Eq a => a -> a -> Bool
/=b
b) (b -> Bool) -> ((b, k) -> b) -> (b, k) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b, k) -> b
forall a b. (a, b) -> a
fst) [(b, k)]
ts)
lens :: (t -> t) -> (t -> a -> b) -> (t -> f a) -> t -> f b
lens getter :: t -> t
getter setter :: t -> a -> b
setter f :: t -> f a
f a :: t
a = (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (t -> a -> b
setter t
a) (t -> f a
f (t -> t
getter t
a))