Next: Type class constraints on predicates and functions, Previous: Abstract typeclass declarations, Up: Type classes [Contents]
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 in the implementation section of the same module by a corresponding non-abstract instance declaration that defines how the type class methods are implemented.
Here is 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.