[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