
On Sun, Mar 12, 2006 at 09:15:57PM +0200, Einar Karttunen wrote:
On 12.03 18:44, Martin Percossi wrote:
However, just out of curiosity, I'm still curious at how I could do the runSTMatrix, which would really be the icing on the cake in terms of client usability.
You might want to look at the definition of Data.Array.ST (at http://darcs.haskell.org/packages/base/Data/Array/ST.hs) runSTUArray is defined as follows:
runSTUArray :: (Ix i) => (forall s . ST s (STUArray s i e)) -> UArray i e runSTUArray st = runST (st >>= unsafeFreezeSTUArray)
A similar way should work for matrixes.
Tried the following: unsafeFreezeMatrix :: MMatrix s -> ST s Matrix unsafeFreezeMatrix (MMatrix x1 x2 marray) = do block <- unsafeFreeze marray return $ Matrix x1 x2 block runSTMatrix :: (forall s . ST s (MMatrix s)) -> Matrix runSTMatrix st = runST (st >>= unsafeFreezeMatrix) but I get the error: matrix.hs:131:31: Couldn't match `MMatrix s' against `ST s1 (MMatrix s1)' Expected type: ST s1 (MMatrix s1) -> . (forall s1) b Inferred type: MMatrix s -> ST s Matrix In the second argument of `(>>=)', namely `unsafeFreezeMatrix' In the first argument of `runST', namely `(st >>= unsafeFreezeMatrix)'