On Tue, 2004-06-29 at 18:42, MR K P SCHUPKE wrote:
> Erm, something I remember about needing MArrays... Here's something
> which does the same thing (cooks and MArray then freezes it - also using
> STUArray... The neat thing is MArray is a class, so you can swap between
> STUArray and STArray implementations without changing code.

I tried generalising the type to not mention which of STUArray and
STArray I'm using. Letting ghc infer the type gives this type,
unfortunately annotating the function with this type gives a type
error!!  Compiler/typechecker bug perhaps?

buildUArray bounds f = do arr <- buildUArray' bounds f
                          unsafeFreeze arr

ghc infers this type:
buildUArray :: forall a i b s array.
               (MArray (array s) a (ST s), Ix i, IArray b a) =>
               (i, i) -> (i -> a) -> ST s (b i a)

however if one add this annotation I get the same error message I got
originally:

 Could not deduce (MArray (array1 s) a (ST s))
        from the context (MArray (array s) a (ST s), Ix i, IArray b a)
      arising from use of `unsafeFreeze' at BuildArray.hs:25
    Probable fix:
        Add (MArray (array1 s) a (ST s))
        to the type signature(s) for `buildUArray'
        Or add an instance declaration for (MArray (array1 s) a (ST s))
    In the result of a 'do' expression: unsafeFreeze arr
    In the definition of `buildUArray':
        buildUArray bounds f
                      = do
                          arr <- buildUArray' bounds f
                          unsafeFreeze arr

> This is the classic dynamic programming version of string difference:

[snip]

The difference with your example cod is that I return the array itself
rather than a value calculated using the array. With your code, as soon
as we try to return the array too, I run into the same problem.

Duncan

_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to