X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FLinear%2FVector.hs;h=c9307153cc65330b2e0ec8e4f5eeec85d933607b;hb=5c0366134e8e1c12772cb685ac14b70d22d6ffed;hp=e4f622588bbd01ee5657465a78daf2d46aa4c7de;hpb=cc93d648089344338030a9b79cd7bea7c6e8c997;p=numerical-analysis.git diff --git a/src/Linear/Vector.hs b/src/Linear/Vector.hs index e4f6225..c930715 100644 --- a/src/Linear/Vector.hs +++ b/src/Linear/Vector.hs @@ -1,31 +1,44 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} -module Linear.Vector +module Linear.Vector ( + module Data.Vector.Fixed.Boxed, + Vec0, + 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(..), + Z, fromList, - toList, - ) -import qualified Data.Vector.Fixed as V ( + toList ) +import Data.Vector.Fixed ( (!), - length, - ) -import Data.Vector.Fixed.Boxed + foldl, + length ) +import Data.Vector.Fixed.Boxed ( + Vec, + Vec2, + Vec3, + Vec4, + Vec5 ) +import NumericPrelude hiding ( abs, length, foldl ) +type Vec0 = Vec Z type Vec1 = Vec N1 -type Vec4 = Vec N4 -type Vec5 = Vec N5 @@ -42,8 +55,8 @@ type Vec5 = Vec N5 -- (!?) :: (Vector v a) => v a -> Int -> Maybe a (!?) v1 idx - | idx < 0 || idx >= V.length v1 = Nothing - | otherwise = Just $ v1 V.! idx + | idx < 0 || idx >= length v1 = Nothing + | otherwise = Just $ v1 ! idx -- | Remove an element of the given vector. @@ -66,3 +79,17 @@ delete v1 idx = where (lhalf, rhalf) = splitAt idx (toList v1) rhalf' = tail rhalf + + +-- | We provide our own sum because 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 = foldl (+) (fromInteger 0)