[Haskell-cafe] Re: [Haskell] Help in understanding a type error involving forall and class constraints

Duncan Coutts duncan.coutts at worcester.oxford.ac.uk
Wed Jun 30 07:54:47 EDT 2004


On Wed, 2004-06-30 at 12:00, MR K P SCHUPKE wrote:
> Ahh.. I see whats happening:
> 
> MArray (STUArray s) a (ST s) => String -> String -> ST s (UArray (Int,Int) a)
> 
> IArray UArray a => String -> String -> a
> 
> nothing here is specifying a... you cannot leave a polymorphic in this case.
> 
> You need to supply the constraint "MArray (STUArray s) a (ST s)" to distString
> but "s" is not in context...

Right, because the return type of distString Int is an instance of
MArray. But if we try to make 'a' polymorphic then we can't specify the
constraint because it involves 's'.

So the obvious follow-on question, is is there any intermediate point
where 's' is in scope where we can supply a type annotation to supply
the context or is it simply impossible?

To restate the question for Haskell-Cafe readers:
        Is it possible to return an arbitrary unboxed array that was
        constructed in the ST monad (as an STUArray)?
        
        The issue is that you end up with a MArray class constraint that
        involves the state thread's 's' parameter, but this type
        variable gets 'hidden' by runST which universally quantifies
        over it. 	runST :: forall a. (forall s. ST s a) -> a

Duncan



More information about the Haskell-Cafe mailing list