6.8.4. Constrained class method types¶
- ConstrainedClassMethods¶
- Since:
- 6.8.1 
 - Allows the definition of further constraints on individual class methods. 
Haskell 98 prohibits class method types to mention constraints on the class type variable, thus:
class Seq s a where
  fromList :: [a] -> s a
  elem     :: Eq a => a -> s a -> Bool
The type of elem is illegal in Haskell 98, because it contains the
constraint Eq a, which constrains only the class type variable (in
this case a). More precisely, a constraint in a class method signature is rejected if
- The constraint mentions at least one type variable. So this is allowed: - class C a where op1 :: HasCallStack => a -> a op2 :: (?x::Int) => Int -> a 
- All of the type variables mentioned are bound by the class declaration, and none is locally quantified. Examples: - class C a where op3 :: Eq a => a -> a -- Rejected: constrains class variable only op4 :: D b => a -> b -- Accepted: constrains a locally-quantified variable `b` op5 :: D (a,b) => a -> b -- Accepted: constrains a locally-quantified variable `b` 
GHC lifts this restriction with language extension
ConstrainedClassMethods. The restriction is a pretty stupid one in
the first place, so ConstrainedClassMethods is implied by
MultiParamTypeClasses.