Arrays and arrays
Ketil Z. Malde
ketil@ii.uib.no
21 Jan 2003 10:50:28 +0100
ketil@ii.uib.no (Ketil Z. Malde) writes:
> Hal Daume III <hdaume@ISI.EDU> writes:
>> Yes, (//) is terrible. It *never* tries to update in-place.
> Any reason it couldn't be done in-place? (I.e. thaw, update all, and
> freeze again) Am I missing something -- Could partial results be
> used, the update list be infinite, or anything like that?
I'm toying with STArrays in order to fix this. In prinicple it should
be simple, but it ended up a tangled mess of incomprehensible warnings
and strange errors. Oh well, I've boiled it down to something like:
replace :: UArray Int Int -> [(Int,Int)] -> UArray Int Int
replace a p = runST (thaw a >>= \u -> update u p >> freeze u)
update :: STUArray () Int Int -> [(Int,Int)] -> ST () ()
update u ps = mapM_ (uncurry (writeArray u)) ps
Which gives me
Compiling SuffixArray ( SuffixArray.lhs, interpreted )
SuffixArray.lhs:131:
Cannot unify the type-signature variable `s' with the type `()'
Expected type: ST s a
Inferred type: ST () (b Int Int)
In the expression: (thaw a) >>= (\ u -> (update u p) >> (freeze u))
In the first argument of `runST', namely
`((thaw a) >>= (\ u -> (update u p) >> (freeze u)))'
I've tried rearranging the code in various ways, but I can get no
further.
Sounds to me that setting s=() and a=(b Int Int) would do the trick,
but apparently the compiler disagrees. I haven't used the ST monad
before, so perhaps I'm missing something obvious?
-kzm
--
If I haven't seen further, it is by standing in the footprints of giants