Next: Type class constraints on type class declarations, Previous: Abstract instance declarations, Up: Type classes [Contents]

Mercury allows a type class constraint to appear as part of a predicate or function’s type signature. This constrains the values that can be taken by type variables in the signature to belong to particular type classes.

A type class constraint has the form:

<=Typeclass(Type, …), …

where `Typeclass` is the name of a type class and `Type` is
a type.
Any variable that appears in `Type` must be determined by
the predicate’s or function’s type signature.
A variable is determined by a type signature if it appears in the
type signature, but if functional dependencies are present
then it may also be determined from other variables
(see Functional dependencies).
Each type class constraint in a predicate or function declaration must contain
at least one variable.

For example

:- pred distance(P1, P2, float) <= (point(P1), point(P2)). :- mode distance(in, in, out) is det. distance(A, B, Distance) :- coords(A, Xa, Ya), coords(B, Xb, Yb), XDist = Xa - Xb, YDist = Ya - Yb, Distance = sqrt(XDist*XDist + YDist*YDist).

In the above example, the `distance`

predicate is able to calculate the
distance between any two points, regardless of their representation, as long
as the `coords`

operation has been defined. These
constraints are checked at compile time.