-- Glasgow Haskell 0.403 : BLAS ( Basic Linear Algebra System )
-- **********************************************************************
-- * *
-- * FILE NAME : vector.hs DATE : 4-3-1991 *
-- * *
-- * CONTENTS : Vector datatype and operations implemented by using *
-- * array type of Haskell. *
-- * Vectors are index from 1 to N, where N is the dimension *
-- * of the vector, ie the number of elements in the vector. *
-- **********************************************************************
-- Haskell Arrays:
--
-- Haskell provides indexable arrays, which may be thought of as
-- functions whose domains are isomorphic to contiguous subsets of
-- the integers. Such a restricted class of functions are intended
-- to be very efficiently implementable; in particular, the programmer
-- has a reasonable expectation of rapid access to the components.
-- To ensure the possibility of such an implementation, arrays are
-- treated, not as general fucntions, but as data.
-- Data of array type is Array i e , where i is index type and e
-- is element type.
-- Index classes of Haskell arrays:
-- ================================
--
-- For an one dimension array, its index is of Int type, Char type,etc.
-- While for a two dimension array, its index is of pair type.
--
-- Index must be within the bound of that array. The bound of an one
-- dimension array is a pair which gives the lower and upper bound
-- of its index value.
--
-- Function ( inRange :: (a,a) -> a -> Bool ) checks if an index is
-- in the range of the bound. Function ( range :: (a,a) -> [a] ) returns
-- a list of all indices in this range.
-- Array construction operations(functions):
-- =========================================
--
-- array :: (Ix a) => (a,a) -> [Assoc a b] -> Array a b
-- data Assoc a b = a := b
--
-- (!) :: (Ix a) => Array a b -> a -> b
-- bounds :: (Ix a) => Array a b -> (a,a)
-- assocs :: (Ix a) => (Array a b) -> [Assoc a b]
-- indices :: (Ix a) => (Array a b) -> [a]
-- rangesize :: (Ix a) => (a, a) -> Int
--
-- Array accumulating operations(functions):
-- =========================================
--
-- accumArray :: (Ix a) => (b->c->b) -> b -> (a,a) -> [Assoc a c]
-- -> Array a b
-- accumArray "accumulating function" "initial value"
-- "bounds" "association list"
-- Array increment update operations(functions):
-- =============================================
--
-- (//) :: (Ix a) => Array a b -> Assoc a b -> Array a b
-- It takes an array and an Assoc pair and returns an array
-- identical to the first argument except for the one element
-- specified by the second argument.
--
-- accum :: (Ix a) => (b->c->b) -> Array a b -> [Assoc a c] -> Array a b
-- accum "accumulating function" "array to be updated" "association list"
-- Other operations(functions):
-- ============================
--
-- listArray :: (Ix a) => (a, a) -> [b] -> Array a b
-- elems :: (Ix a) => (Array a a) -> [a]
--
-- amap :: (Ix a) => (b->c) -> Array a b -> Array a c
-- ixmap :: (Ix a, Ix b) => (b,b) -> (b->a) -> Array a c -> Array b c
module Vector(Vec, makevec, boundvec, vecsub, incrvec, updvec, maxupdvec,
vecprod, displayvec) where
import Array
import Basics
data Vec a = VEC Int (Array Int a)
displayvec :: (Show a) => Vec a -> [Char]
vecprod :: (Num a) => Vec a -> Vec a -> a
updvec :: Vec a -> [(Int,a)] -> Vec a
maxupdvec :: (Num a, Ord a) => Vec a -> [(Int,a)] -> Vec a
incrvec :: (Num a) => Vec a -> [(Int,a)] -> Vec a
vecsub :: Vec a -> Int -> a
boundvec :: Vec a -> Int
makevec :: Int -> (Int -> a) -> Vec a
makevec n f = VEC n (array (1,n) [ (i,f i) | i <- [1..n] ])
boundvec (VEC n _) = n
vecsub (VEC n va) i = va ! i
updvec (VEC n va) s =
VEC n (accum f va s)
where
f b c = c
maxupdvec (VEC n va) s = VEC n (accum max va s)
incrvec (VEC n va) s = VEC n (accum (+) va s)
vecprod v1 v2 =
sum [(vecsub v1 i) * (vecsub v2 i) | i <- [1..n] ]
where
n = boundvec v1
displayvec v =
"< " ++
concat ([(showrj 8 (vecsub v i) ) | i<- [1..n] ] ) ++
">\n"
where
n = boundvec v
|