
On Tuesday 01 February 2011 11:45:58, Julian Bean wrote:
It indeed does, even though I doubted it at first. As far as I remember the type in
getnArrayST n bs :: ST s (Maybe (UArray Int Word8, [Word8])) =
used to be necessary to bind the type variable s. Apparently things have become easier.
The higher-rank inference has been changed quite a bit, but I think -XPatternSignatures is all you were missing to get your original code to compiler (well, at least to parse).
No, I tried, the parser still choked on the above signature. You can get the other one, (a :: STUArray s Int Word8), to be parsed with PatternSignatures, but A pattern type signature cannot bind scoped type variables `s' unless the pattern has a rigid type context In the pattern: a :: STUArray s Int Word8 In a stmt of a 'do' expression: (a :: STUArray s Int Word8) <- newArray_ (0, n - 1) In the expression: do { (a :: STUArray s Int Word8) <- newArray_ (0, n - 1); let loop k bs | k == n = ... | k < n = ...; loop 0 bs } even if you remove the forall from getnArrayST's type signature. I don't know why `s' is a scoped type variable without the forall and ScopedTypeVariables, but that's what 6.12.3 says. 7.0.1 complains about No instance for (MArray (STUArray s) Word8 (ST s1)) which I understand.
Jules