Type Classes: Defining Overloads
Type classes define a set of operations that can be implemented for many types.
Rex type classes are similar to Haskell’s: they are compile-time constraints with runtime dictionary resolution.
Defining a class
class Size a where {
size : a -> i32;
}
Method signatures can mention the class parameter a and any other types in scope.
Empty Classes
Classes with methods use where { ... }. Marker classes with no methods use a semicolon:
class Marker a;
Operators as methods
class Eq a where {
== : a -> a -> Bool;
!= : a -> a -> Bool;
}
Superclasses
Superclasses use <= (read “requires”):
class Ord a <= Eq a where {
< : a -> a -> Bool;
}
If you have an Ord a, you also must have an Eq a instance.
Multi-parameter classes (tupled)
User-defined classes may take multiple type parameters. For example:
In Rex source you write:
class Convert a b where {
convert : a -> b;
}
In where constraints, multi-parameter classes are written using a tuple:
where Convert (a, b) -> ...
This matches the implementation model described in Specification.