so, A common idiom when using Control.Monad.ST is to do some complicated, state using computation to compute a big array which is then used purely functionally as a read-only array in the rest of the program. to avoid the cost of copying the array at the end, we are forced to use 'unsafeFreeze'. it occurs to me that this particular idiom can actually be done safely, by adding the following... runSTArray :: (forall s . (ST s (STArray s i e))) -> Array i e runSTUArray :: (forall s . (ST s (STUArray s i e))) -> UArray i e now, since these discard 's' and hence the ability to modify the arrays they return, they may safely use the final arrays directly as if they were immutable. the routines are also very easy to implement: runSTArray st = runST $ st >>= unsafeFreeze runSTUArray st = runST $ st >>= unsafeFreeze so, is my logic correct? that runSTArray and runSTUArray need not be considered unsafe? if so, perhaps we should add these (or some better generalization that someone comes up with) to the standard libraries, as it would be nice to be able to use this idiom without resorting to trickery. (well, user visible trickery at least) John -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@foo.net ---------------------------------------------------------------------------
afaik, this is fine. in fact, i use this idiom very frequently, so if it's bad, i've never seen the badness of it. On Tue, 30 Dec 2003, John Meacham wrote:
so, A common idiom when using Control.Monad.ST is to do some complicated, state using computation to compute a big array which is then used purely functionally as a read-only array in the rest of the program.
to avoid the cost of copying the array at the end, we are forced to use 'unsafeFreeze'. it occurs to me that this particular idiom can actually be done safely, by adding the following...
runSTArray :: (forall s . (ST s (STArray s i e))) -> Array i e runSTUArray :: (forall s . (ST s (STUArray s i e))) -> UArray i e
now, since these discard 's' and hence the ability to modify the arrays they return, they may safely use the final arrays directly as if they were immutable.
the routines are also very easy to implement: runSTArray st = runST $ st >>= unsafeFreeze runSTUArray st = runST $ st >>= unsafeFreeze
so, is my logic correct? that runSTArray and runSTUArray need not be considered unsafe? if so, perhaps we should add these (or some better generalization that someone comes up with) to the standard libraries, as it would be nice to be able to use this idiom without resorting to trickery. (well, user visible trickery at least) John
-- Hal Daume III | hdaume@isi.edu "Arrest this man, he talks in maths." | www.isi.edu/~hdaume
participants (2)
-
Hal Daume III -
John Meacham