module Math.Algebras.TensorProduct where
import Math.Algebras.VectorSpace
data Tensor a b = T a b deriving (Eq, Ord, Show)
te :: Num k => Vect k a -> Vect k b -> Vect k (Tensor a b)
te (V us) (V vs) = V [(T ei ej, xi*xj) | (ei,xi) <- us, (ej,xj) <- vs]
tf :: (Num k, Ord a', Ord b') => (Vect k a -> Vect k a') -> (Vect k b -> Vect k b')
-> Vect k (Tensor a b) -> Vect k (Tensor a' b')
tf f g (V ts) = sum [te (f $ V [(a, 1)]) (g $ V [(b, x)]) | (T a b, x) <- ts]
where sum = foldl add zero
assocL :: Vect k (Tensor u (Tensor v w)) -> Vect k (Tensor (Tensor u v) w)
assocL = fmap (\(T a (T b c)) -> T (T a b) c)
assocR :: Vect k (Tensor (Tensor u v) w) -> Vect k (Tensor u (Tensor v w))
assocR = fmap (\(T (T a b) c) -> T a (T b c))
inUnitL = fmap (\a -> T () a)
inUnitR = fmap (\a -> T a ())
outUnitL = fmap (\(T () a) -> a)
outUnitR = fmap (\(T a ()) -> a)
twist v = nf $ fmap (\(T a b) -> T b a) v