[Haskell] Partially applied type class functions

Paul Govereau govereau at eecs.harvard.edu
Fri Aug 5 12:59:38 EDT 2005

I have encountered a type error that I find quite puzzling. I would
appreciate it if someone could help me understand what is going wrong.
Here is the program:

> data Expr = Var String | Const Int
> data Constraint = Zero Expr | AndL Constraint

> class AbSyn a where
>     subst :: Expr -> String -> a -> a

> instance AbSyn Expr where subst e n expr = expr

> instance AbSyn Constraint where
>     subst e n constr =
>         let sub = subst e n   -- :: AbSyn a => a -> a
>         in case constr
>            of Zero expr -> Zero (sub expr)
>               AndL cs   -> AndL (sub cs)

GHC 6.4 (as well as Hugs March 2005) produces this error:

  Couldn't match `Constraint' against `Expr'
    Expected type: Constraint
    Inferred type: Expr
  In the application `sub cs'
  In the first argument of `AndL', namely `(sub cs)'

If I replace the last line with this one, everything is fine:

               AndL cs   -> AndL (subst e n cs)

It looks sort of like sub is being monomorphised -- or something?

Thanks for having a look,

More information about the Haskell mailing list