[Haskell-cafe] Question about classes from a Haskell newbie.

robert dockins robdockins at fastmail.fm
Tue May 24 16:07:58 EDT 2005


>  However, I didn't understand the syntax of the class declaration.
> 
> Lemmih wrote:
>  > import Complex
>  >
>  > class ConvertibleToComplex a b | a -> b where
>  >    toComplex :: RealFloat b => a -> Complex b
> 
> I've looked at several sources to try to understand this declaration.  I 
> can't find any examples where a class declaration takes two type 
> variables or uses the pipe symbol.  One of the sources I used was 
> _Haskell 98 Language and Libraries The Revised Report_.  I'm not an 
> expert at BNF notation, but the definitions for topdecl, tycls, and 
> tyvar in the grammar seems to exclude Lemmih's declaration.
> 
> If someone could point me to some sources that explain this notation, 
> I'd be very grateful.

This is a multi-parameter typeclass (with functional dependencies), 
which is not a part of Haskell 98, so its no surprise that you didn't 
find it in the Report.  The Muli-parameter part is pretty easy to 
understand: the type class simply introduces more than one type 
variable.  Functional dependencies let you say which types should 
determine which other types.  Here are some pages on these ideas:

http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#multi-param-type-classes
http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#functional-dependencies
http://haskell.org/hawiki/FunDeps

In this particular instance, what the class definition means is that 
'ConvertaibleToComplex' is a class which relates two types 'a' and 'b' 
AND the type 'a' uniquely determines the type 'b'.


Hope that helps,
Robert Dockins



More information about the Haskell-Cafe mailing list