module Data.YAP.Vector (Vector(..), dot, norm) where
import Prelude.YAP
import Data.YAP.Algebra
newtype Vector a = Vector [a]
deriving (Eq, Show)
instance Functor Vector where
fmap f (Vector as) = Vector (fmap f as)
instance (AbelianGroup a) => AbelianGroup (Vector a) where
zero = Vector (repeat zero)
Vector as + Vector bs = Vector (zipWith (+) as bs)
Vector as Vector bs = Vector (zipWith () as bs)
negate (Vector as) = Vector (map negate as)
dot :: (Ring a) => Vector a -> Vector a -> a
dot (Vector as) (Vector bs) = sum' (zipWith (*) as bs)
norm :: (Ring a) => Vector a -> a
norm v = v `dot` v
sum' :: (AbelianGroup a) => [a] -> a
sum' = foldr (+) zero