
Was just thinking about GHC's implementation of arrays, and their poor performance. I know little about GHC's internal workings, but I was thinking about how array performance could be improved. What if when writing an array you instead construct a function: f :: (Ix x,Ix y) => Array a -> Ix x -> a -> Ix y -> a f a x b y | x==y = b | otherwise = a!y Then the update in place operator // becomes a curried application of 'f' above. You could then define a a series of 'overlays' for a base array. The clever bit would be to get the garbage collector to merge the two as soon as any reference to the original array is discarded. Does GHC already do anything like this? Regards, Keean Schupke.

On Mon, 23 Feb 2004, MR K P SCHUPKE wrote:
Was just thinking about GHC's implementation of arrays, and their poor performance. I know little about GHC's internal workings, but I was thinking about how array performance could be improved.
What if when writing an array you instead construct a function:
f :: (Ix x,Ix y) => Array a -> Ix x -> a -> Ix y -> a f a x b y | x==y = b | otherwise = a!y
Then the update in place operator // becomes a curried application of 'f' above.
You could then define a a series of 'overlays' for a base array. The clever bit would be to get the garbage collector to merge the two as soon as any reference to the original array is discarded.
Does GHC already do anything like this?
No it doesn't. But if you want this behaviour you should look at Data.Array.Diff . I think that library does what you want. Cheers, /Josef
participants (2)
-
Josef Svenningsson
-
MR K P SCHUPKE