Class InstancesΒΆ

Our Eq class defines a simple algebra which specifies an interface for equivalence relations together with their semantics. We have to use an instance to populate the algebra.

instance Eq[int] {
  fun == : int * int -> bool = "$1==$2";

Here we have defined an instance of the Eq class for the argument type int. Our code implements the Eq class interface, by defining all the non-default virtual methods.

In this case the definition is done by delegating the implementation to C++, using a binding.

We would like equality for double as well:

instance Eq[double] {
  fun == double * double -> bool = "$1==$2";
  fun != double * double -> bool = "$1!=$2";

Here we choose to also define the != function as well, overriding the default provided in the class.

When you provide instances, it is usual to ensure there is a definition for all the class methods. Care must be taken to avoid circular definitions, because that will lead to inifinite recursions at run time.