[Haskell-cafe] Mutable arrays
Stefan O'Rear
stefanor at cox.net
Tue Feb 5 20:26:43 EST 2008
On Tue, Feb 05, 2008 at 06:00:38PM -0600, John Lato wrote:
> -- let ary_max = foldl1' max $ elems $ unsafeFreeze myArray
>
> If you use a boxed array type (IOArray or STArray) for myArray, and
> compiled with GHC, no copying is necessary (you may need to use type
> annotations to guarantee this). Then use the foldl' function to get
> array_max, and map it onto the original mutable array. I think it
> would be safe provided that you calculate ary_max before you start to
> modify the array, which is true for normalization.
Eek! unsafeFreeze isn't a type cast, it actually modifies flags in the
heap object which are used by the generational garbage collector. It's
quite concievable that you could get segfaults by modifying a boxed
array after passing it to unsafeFreeze.
This, I believe, would work:
let ary_max = foldl1' max [ inlinePerformIO (readArray myArray ix)
| ix <- range (inlinePerformIO (getBounds myArray)) ]
But it's equally untested.
Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20080205/6a07d40d/attachment.bin
More information about the Haskell-Cafe
mailing list