]> gitweb.michael.orlitzky.com - numerical-analysis.git/blob - src/Linear/Vector.hs
Convert scalars to 1x1 vectors.
[numerical-analysis.git] / src / Linear / Vector.hs
1 {-# LANGUAGE FlexibleContexts #-}
2 {-# LANGUAGE FlexibleInstances #-}
3 {-# LANGUAGE MultiParamTypeClasses #-}
4 {-# LANGUAGE ScopedTypeVariables #-}
5 {-# LANGUAGE TypeFamilies #-}
6
7 module Linear.Vector
8 where
9
10 import Data.List (intercalate)
11 import Data.Vector.Fixed (
12 Dim,
13 Fun(..),
14 N1,
15 N2,
16 N3,
17 N4,
18 Vector(..),
19 construct,
20 inspect,
21 toList,
22 )
23 import qualified Data.Vector.Fixed as V (
24 length,
25 )
26
27 import Normed
28
29
30 -- * Low-dimension vector wrappers.
31 --
32 -- These wrappers are instances of 'Vector', so they inherit all of
33 -- the userful instances defined above. But, they use fixed
34 -- constructors, so you can pattern match out the individual
35 -- components.
36
37 data D1 a = D1 a
38 type instance Dim D1 = N1
39 instance Vector D1 a where
40 inspect (D1 x) (Fun f) = f x
41 construct = Fun D1
42
43 data D2 a = D2 a a
44 type instance Dim D2 = N2
45 instance Vector D2 a where
46 inspect (D2 x y) (Fun f) = f x y
47 construct = Fun D2
48
49 data D3 a = D3 a a a
50 type instance Dim D3 = N3
51 instance Vector D3 a where
52 inspect (D3 x y z) (Fun f) = f x y z
53 construct = Fun D3
54
55 data D4 a = D4 a a a a
56 type instance Dim D4 = N4
57 instance Vector D4 a where
58 inspect (D4 w x y z) (Fun f) = f w x y z
59 construct = Fun D4
60
61
62 -- | Unsafe indexing.
63 --
64 -- Examples:
65 --
66 -- >>> let v1 = D2 1 2
67 -- >>> v1 ! 1
68 -- 2
69 --
70 (!) :: (Vector v a) => v a -> Int -> a
71 (!) v1 idx = (toList v1) !! idx
72
73 -- | Safe indexing.
74 --
75 -- Examples:
76 --
77 -- >>> let v1 = D3 1 2 3
78 -- >>> v1 !? 2
79 -- Just 3
80 -- >>> v1 !? 3
81 -- Nothing
82 --
83 (!?) :: (Vector v a) => v a -> Int -> Maybe a
84 (!?) v1 idx
85 | idx < 0 || idx >= V.length v1 = Nothing
86 | otherwise = Just $ v1 ! idx