X-Git-Url: http://gitweb.michael.orlitzky.com/?p=numerical-analysis.git;a=blobdiff_plain;f=src%2FLinear%2FVector.hs;h=c9307153cc65330b2e0ec8e4f5eeec85d933607b;hp=aa1568bec6c2ff3b8ed0baa724177349fb04e3bb;hb=261aa714471648c0bcbc603117a420a1fc617ba3;hpb=1f64a1a33b2636ef2e863a0b577c8d8d50233580 diff --git a/src/Linear/Vector.hs b/src/Linear/Vector.hs index aa1568b..c930715 100644 --- a/src/Linear/Vector.hs +++ b/src/Linear/Vector.hs @@ -1,43 +1,46 @@ {-# 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 ( - length, - ) -import Data.Vector.Fixed.Boxed + toList ) +import Data.Vector.Fixed ( + (!), + 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 --- | Unsafe indexing. --- --- Examples: --- --- >>> import Data.Vector.Fixed (mk2) --- >>> let v1 = mk2 1 2 :: Vec2 Int --- >>> v1 ! 1 --- 2 --- -(!) :: (Vector v a) => v a -> Int -> a -(!) v1 idx = (toList v1) !! idx -- | Safe indexing. -- @@ -52,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 ! idx + | idx < 0 || idx >= length v1 = Nothing + | otherwise = Just $ v1 ! idx -- | Remove an element of the given vector. @@ -65,9 +68,28 @@ type Vec5 = Vec N5 -- >>> delete b 1 :: Vec2 Int -- fromList [1,3] -- -delete :: (Vector v a, Vector w a, Dim v ~ S (Dim w)) => v a -> Int -> w a +delete :: (Vector v a, + Vector w a, + Dim v ~ S (Dim w)) + => v a + -> Int + -> w a delete v1 idx = - fromList $ (lhalf ++ rhalf') + fromList (lhalf ++ rhalf') 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)