wiki:ClassMethodTypes

Version 10 (modified by john@…, 8 years ago) (diff)

remove long winded explanation. replace with concise sentence.

Class Method Types

Brief Explanation

In Haskell 98, s4.3.1, the signatures of methods in a class may contain constraints, but these constraints must not mention the argument of the type class. The following is illegal:

class Foo a where
    op :: Num a => a -> a -> a

The motivation was perhaps that without such constraints, class dictionaries could be represented as records with PolymorphicComponents.

However this restriction is not implemented by Hugs, following a suggestion of Mark Jones in Typing Haskell in Haskell, and can be turned off in GHC with -fglasgow-exts.

interaction with existentials

If this were allowed than existential types of the form

data SomeFoo = exists a . Foo a => SomeFoo a

would have to carry around a dictionary for Num as well as Foo in dictionary passing implementation of type classes if it wished to use methods of this form.

Typecase based implementations of classes such as jhcs do not have a problem with classes or existentials of this form since all classes are determined from the single type parameter no matter how many classes are actually needed.

Examples

Can someone submit some real world examples of where this would be useful?

Cons

Tickets

#17
relax restriction on signatures of class methods