MArrayt and runST

Keean k.schupke@ic.ac.uk
Thu, 13 Feb 2003 09:56:27 -0000


I appreciate this may have been covered before, but i'm struggling to get
the types
right for the following functions:

firstly I have a function I want to be passed an MArray (so the function
itself is polymorphic and independant of the type of array used). This has a
type similar to:

fn1 :: MArray a Int m => a (Int,Int) Int -> m ()

now I want to produce a wrapper function to provide an MArray of a given
type, and
freeze the result into a non-mutable array, so I have a function like:

wrapper :: MArray (STUArray s) Int (ST s) => ST s (Array (Int,Int) Int)
wrapper = do
	d <- newArray ((0,0),(10,10)) 0
	fn1 d
	unsafeFreeze d

However the problem comes when I try and use runST to run it...

runMatrix :: Array (Int,Int) Int
runMatrix = runST $ wrapper

This is becase 's' escapes
Expected: ST s a -> b
Inferred: (forall s1. ST s1 a) -> a

where am I going wrong?

	Regards,
	Keean Schupke.