On Thursday 25 August 2005 19:58, Udo Stenzel wrote: > [...] you'll need a type signature somewhere to help ghc resolve > the overloading of newArray and readArray, which is surprisingly > tricky due to the "s" that must not escape. This works: > > compute :: Int -> Int > compute n = runST ( do > arr <- newArray (-1, 1) n :: ST s (STArray s Int Int) > readArray arr 1 > )
Hello, I am fighting with a similar problem. I want to use STUArray but without committing to a fixed element type. For instance, here is a function that appends two UArrays: A little helper first > copy :: (MArray a e m, IArray b e) => > a Int e -> Int -> b Int e -> Int -> Int -> m () > copy dest destix src srcix cnt > | cnt <= 0 = return () > | otherwise = do > writeArray dest destix (src ! srcix) > copy dest (destix+1) src (srcix+1) (cnt-1) and here is the append function > append :: UArray Int e -> UArray Int e -> Int -> UArray Int e > append x y low = runSTUArray (do > z <- newArray_ (low,low+len x+len y) > copy z low x (first x) (len x) > copy z (low+len x) y (first y) (len y) > return z) > where > len = rangeSize . bounds > first = fst . bounds Of course this can't work, because 'copy' needs the MArray and IArray contexts: No instance for (MArray (STUArray s) e (ST s)) arising from use of `copy' at Problem.lhs:31:7-10 [...] No instance for (IArray UArray e) arising from use of `copy' at Problem.lhs:31:7-10 [...] But now, when I add > append :: (IArray UArray e, MArray (STUArray s) e (ST s)) => ... I still get the same error message regarding the MArray constraint: No instance for (MArray (STUArray s) e (ST s)) arising from use of `copy' at Problem.lhs:31:7-10 What am I missing? Ben _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe