]> gitweb.michael.orlitzky.com - numerical-analysis.git/blobdiff - src/Linear/Vector.hs
Switch Linear.Vector to the numeric prelude and add the element_sum function to it.
[numerical-analysis.git] / src / Linear / Vector.hs
index e4f622588bbd01ee5657465a78daf2d46aa4c7de..9d43bfac3122e82824d6a6921b6b33d69ba821a2 100644 (file)
@@ -1,31 +1,40 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeFamilies #-}
 
-module Linear.Vector
+module Linear.Vector (
+  module Data.Vector.Fixed.Boxed,
+  Vec1,
+  (!?),
+  delete,
+  element_sum )
 where
 
+import qualified Algebra.Additive as Additive ( C )
+import qualified Algebra.Ring as Ring ( C )
 import Data.Vector.Fixed (
   Dim,
   N1,
-  N4,
-  N5,
   S,
   Vector(..),
   fromList,
-  toList,
-  )
+  toList )
 import qualified Data.Vector.Fixed as V (
   (!),
-  length,
-  )
-import Data.Vector.Fixed.Boxed
+  foldl,
+  length )
+import Data.Vector.Fixed.Boxed (
+  Vec,
+  Vec2,
+  Vec3,
+  Vec4,
+  Vec5 )
+import NumericPrelude hiding ( abs )
 
 type Vec1 = Vec N1
-type Vec4 = Vec N4
-type Vec5 = Vec N5
 
 
 
@@ -66,3 +75,17 @@ delete v1 idx =
   where
     (lhalf, rhalf) = splitAt idx (toList v1)
     rhalf' = tail rhalf
+
+
+-- | We provide our own sum because V.sum relies on a Num instance
+--   from the Prelude that we don't have.
+--
+--   Examples:
+--
+--   >>> import Data.Vector.Fixed (mk3)
+--   >>> let b = mk3 1 2 3 :: Vec3 Int
+--   >>> element_sum b
+--   6
+--
+element_sum :: (Additive.C a, Ring.C a, Vector v a) => v a -> a
+element_sum = V.foldl (+) (fromInteger 0)