On 23 March 2011 21:07, Ketil Malde <[email protected]> wrote:
> Shouldn't it be possible to create an array in a loop with only constant
> memory overhead?
I think it should. Maybe we need something like this:
unsafeArrayM :: Ix i => (i, i) -> Int -> IO e -> IO (Array i e)
unsafeArrayM (l,u) n@(I# n#) (IO f) = IO $ \s1# ->
case newArray# n# arrEleBottom s1# of
(# s2#, marr# #) ->
let go i# s#
| i# ==# n# =
case unsafeFreezeArray# marr# s# of
(# s3#, arr# #) -> (# s3#, Array l u n arr# #)
| otherwise =
case f s# of
(# s3#, x #) ->
case writeArray# marr# i# x s3# of
s4# -> go (i# +# 1#) s4#
in go 0# s2#
The given IO computation can then be something like: unsafeIOToSTM $ newTVar e.
Note that I haven't compiled and tested this code at all nor thought
about it to deeply ;-)
Bas
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe