
Jason beat me, but I can elaborate on the matter: Am Montag, 1. September 2008 18:22 schrieb Larry Evans:
expr2null :: (GramExpr inp_type var_type) -> (GramNull inp_type var_type) {- expr2null GramExpr returns a GramNull expression which indicates whether the GramExpr can derive the empty string. -}
expr2null NullExpr = OneNull expr2null (InpExpr inp_valu) = ZeroNull::(GramNull inp_type var_type) expr2null (VarExpr var_valu) = (VarNull var_valu)::(GramNull inp_type var_type)
The type variables from the pattern signatures are NOT those from the type signature of expr2null, they are fresh type variables. So your pattern signatures actually say that expr2null (InpExpr inp_valu) has type GramNull a b, for all types a and b. If you omit the patterns signatures, the type checker determines that they have the correct type. If you want to keep the pattern signatures (superfluous in this case, but there are situations where it's necessary), you must bring the type variables into scope. That is done by the ScopedTypeVariables language extension, best included as a LANGUAGE pragma in the source and the -then- keyword forall: expr2null :: forall inp_type var_type. GramExpr inp_type var_type -> GramNull inp_type var_type Cheers, Daniel