]> gitweb.michael.orlitzky.com - numerical-analysis.git/blob - 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
1 {-# LANGUAGE FlexibleContexts #-}
2 {-# LANGUAGE FlexibleInstances #-}
3 {-# LANGUAGE MultiParamTypeClasses #-}
4 {-# LANGUAGE NoImplicitPrelude #-}
5 {-# LANGUAGE ScopedTypeVariables #-}
6 {-# LANGUAGE TypeFamilies #-}
7
8 module Linear.Vector (
9 module Data.Vector.Fixed.Boxed,
10 Vec1,
11 (!?),
12 delete,
13 element_sum )
14 where
15
16 import qualified Algebra.Additive as Additive ( C )
17 import qualified Algebra.Ring as Ring ( C )
18 import Data.Vector.Fixed (
19 Dim,
20 N1,
21 S,
22 Vector(..),
23 fromList,
24 toList )
25 import qualified Data.Vector.Fixed as V (
26 (!),
27 foldl,
28 length )
29 import Data.Vector.Fixed.Boxed (
30 Vec,
31 Vec2,
32 Vec3,
33 Vec4,
34 Vec5 )
35 import NumericPrelude hiding ( abs )
36
37 type Vec1 = Vec N1
38
39
40
41 -- | Safe indexing.
42 --
43 -- Examples:
44 --
45 -- >>> import Data.Vector.Fixed (mk3)
46 -- >>> let v1 = mk3 1 2 3 :: Vec3 Int
47 -- >>> v1 !? 2
48 -- Just 3
49 -- >>> v1 !? 3
50 -- Nothing
51 --
52 (!?) :: (Vector v a) => v a -> Int -> Maybe a
53 (!?) v1 idx
54 | idx < 0 || idx >= V.length v1 = Nothing
55 | otherwise = Just $ v1 V.! idx
56
57
58 -- | Remove an element of the given vector.
59 --
60 -- Examples:
61 --
62 -- >>> import Data.Vector.Fixed (mk3)
63 -- >>> let b = mk3 1 2 3 :: Vec3 Int
64 -- >>> delete b 1 :: Vec2 Int
65 -- fromList [1,3]
66 --
67 delete :: (Vector v a,
68 Vector w a,
69 Dim v ~ S (Dim w))
70 => v a
71 -> Int
72 -> w a
73 delete v1 idx =
74 fromList (lhalf ++ rhalf')
75 where
76 (lhalf, rhalf) = splitAt idx (toList v1)
77 rhalf' = tail rhalf
78
79
80 -- | We provide our own sum because V.sum relies on a Num instance
81 -- from the Prelude that we don't have.
82 --
83 -- Examples:
84 --
85 -- >>> import Data.Vector.Fixed (mk3)
86 -- >>> let b = mk3 1 2 3 :: Vec3 Int
87 -- >>> element_sum b
88 -- 6
89 --
90 element_sum :: (Additive.C a, Ring.C a, Vector v a) => v a -> a
91 element_sum = V.foldl (+) (fromInteger 0)