X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FLinear%2FVector.hs;h=9d43bfac3122e82824d6a6921b6b33d69ba821a2;hb=d8dc884aa9b16c7bbd88c4c107ddd684a339a191;hp=aa1568bec6c2ff3b8ed0baa724177349fb04e3bb;hpb=1f64a1a33b2636ef2e863a0b577c8d8d50233580;p=numerical-analysis.git diff --git a/src/Linear/Vector.hs b/src/Linear/Vector.hs index aa1568b..9d43bfa 100644 --- a/src/Linear/Vector.hs +++ b/src/Linear/Vector.hs @@ -1,43 +1,42 @@ {-# 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 --- | 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. -- @@ -53,7 +52,7 @@ 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 + | otherwise = Just $ v1 V.! idx -- | Remove an element of the given vector. @@ -65,9 +64,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 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)