That is error-prone.
Plus the code does not need ScopedTypeVariables. The real problem comes from the use of a class constraint on the LegGram data constructor.

data LegGram nt t s = Ord nt => LegGram (M.Map nt [RRule nt t s])

Short answer: you can't add class constraints to an already declared type variable:

The LegGram type constructor declares the 'nt' variable (and then brings it into scope), so trying afterwards to add a constraint to it for the LegGram data constructor is invalid, so the compiler understands this:
data LegGram nt t s = forall nt. Ord nt => LegGram (M.Map nt [RRule nt t s])
...the declaration and scoping of a new type variable.

This is it, right?

2012/1/3 Yucheng Zhang <yczhang89@gmail.com>
As I understand it, both ways work.

> legSome ((LegGram g)::LegGram nt t s) ntV

If you compile this without ScopedTypeVariables extension, GHC will
remind you of it:

>    Illegal signature in pattern: LegGram nt t s
>        Use -XScopedTypeVariables to permit it

So another solution is to avoid the ugly redundancy is:

> legSome :: forall nt t s . LegGram nt t s -> nt -> Either String ([t], s)

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe