[Haskell-cafe] More STUArray questions

Martin Percossi mpercossi at martinpercossi.com
Sun Mar 12 14:20:48 EST 2006


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)'


More information about the Haskell-Cafe mailing list