[Haskell-beginners] why do classes require the type variable in type signatures?

Andres Löh andres at well-typed.com
Wed Apr 23 08:35:39 UTC 2014

If you have a class like this

> class AlsoSpecial a where
>     isAlsoSpecial :: b -> Bool

then 'isAlsoSpecial' would get a type like this

isAlsoSpecial :: AlsoSpecial a => b -> Bool

There may be several instances of class 'AlsoSpecial' with different
implementations. GHC has the task of figuring out which of the
implementations to use in a specific situation. It does so by looking
at the context in which it is used. But if, like here, the type itself
does not mention the class variable, then learning about the context
won't help. For example, if we use the function like this

isAlsoSpecial 'x'

then GHC learns that 'b' must be a 'Char', but it still does not know
anything about 'a'. In fact, there's absolutely no way to establish
information about 'a' at all. This is the problem, and this is why the
class method is rejected in the first place.

(The translation to Core is still possible. In Core itself, every type
application is explicit, so in Core there'd be a syntax to manually
resolve the ambiguity by explicitly selecting which 'a' we want to use
and passing the appropriate dictionary. But Haskell's surface language
doesn't provide this option, and it never has.)


Andres Löh, Haskell Consultant
Well-Typed LLP, http://www.well-typed.com

Registered in England & Wales, OC335890
250 Ice Wharf, 17 New Wharf Road, London N1 9RF, England

More information about the Beginners mailing list