[mercury-users] Typeclass instance variable types question.

Maxime Van Assche mva at missioncriticalit.com
Fri Dec 18 20:41:18 AEDT 2009


Just a (naive?) question...

Why does the compiler requires a typeclass instance to have all of its types non-variable?
I understand that the goal is to be able to verify uniqueness.

However, as far as I can tell, requiring all the types non-variable is too conservative?
Only one of the instance types must be non-variable in order to verify uniqueness.
Of course, caution must be taken with functional dependencies constraints.

If this makes sense, it could simplify a lot of code, because forcing all non-variable types leads to useless types and instances.
A typical simple example:

:- typeclass x(A, B) <= y(B) where [ ... ].

:- typeclass y(B) where [...].

:- type a(A) ---> a(A).
:- type b(B) ---> b(B).

:- instance x(a(A), b(B)) where [...].

:- instance y(b(B)) <= y(B) where [just (de)construct b(B)...].

while, all I wanted to express was
:- instance x(a(A), B) <= (y(B)) where [...].

Of course, then one cannot define an instance x(A, b(B)), nor x(a(A), b(B)).

This is a simple example, but my real test case leads to many useless wrapping,
and makes things very complicated to read.


mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au

More information about the users mailing list