Next: , Previous: Abstract typeclass declarations, Up: Type classes


10.4 Abstract instance declarations

Abstract instance declarations are instance declarations whose implementations are hidden. An abstract instance declaration has the same form as an instance declaration, but without the ‘where [...]’ part. An abstract instance declaration declares that a sequence of types is an instance of a particular type class without defining how the type class methods are implemented for those types. Like abstract type declarations, abstract instance declarations are only useful in the interface section of a module. Each abstract instance declaration must be accompanied by a corresponding non-abstract instance declaration that defines how the type class methods are implemented.

Here's an example:

     :- module hashable.
     :- interface.
     :- import_module int, string.
     
     :- typeclass hashable(T) where [func hash(T) = int].
     :- instance hashable(int).
     :- instance hashable(string).
     
     :- implementation.
     
     :- instance hashable(int) where [func(hash/1) is hash_int].
     :- instance hashable(string) where [func(hash/1) is hash_string].
     
     :- func hash_int(int) = int.
     hash_int(X) = X.
     
     :- func hash_string(string) = int.
     hash_string(S) = H :-
             % use the standard library predicate string.hash/2
             string.hash(S, H).
     
     :- end_module hashable.