On Sun, 9 Sep 2007, Axel Gerstenberger wrote:
I am used to work with map, zip and zipWith, when working with lists,
however, I could not find such functions for Arrays.
Since 'Array' is an instance of Functor you can use 'fmap' for applying a
function to all elements.
For example, in my Finite Element prototype, I have a function
type Dof = Double
type TimeInc = Double
predictU :: Double -> TimeInc -> Dof -> Dof -> Dof -> Dof
predictU beta dt u u_t u_tt = u + dt*u_t + ((dt**2.0)/2.0)*(1.0 - 2.0*beta
) * u_tt
Given 3 equal sized lists un, vn and an of double values [Dof], I apply it
with
u_est = zipWith3 (predictU beta dt) un vn an
I like it's conciseness, but is that efficient?
The problem with combining array is, that they can not only differ in
length, but can also have different start indices. How to handle this
generically?
The best way to express that two vectors have the same interval of indices
is to put them in one array, e.g.
Array i (a, b) instead of (Array i a, Array i b)
Of course this is not alway possible.
The lists can be very long and correspond to a plain C++ vectors in
corresponding C++ codes.
Lists can still be the better structure for your application if you do not
need random access.
my own "map" for a vector I defined based on the Array documention
(Data.Array) as
mapVec f vec = vec//[ (i, f(vec!i)) |i<-[a..b]]
where
(a,b) = bounds vec
You do not need update (//) if you overwrite all elements. (//) generates
a new array anyway.
Btw. you can obtain all indices of an array by
range (bounds vec)
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe