[mercury-users] Typeclasses & parameters

Tomas By tomas at basun.net
Fri May 25 19:26:11 AEST 2007

Hello everybody,

Suppose I have two different types of trees:

:- type tree1(V,E).

:- type tree2(V,E).

where V & E are vertex and edge labels, so it might be
`tree1(string,string)' or enumeration types:

:- type mytree == tree1(myvertex,myedge).
:- type myvertex ---> a ; b ; c.
:- type myedge ---> d ; e ; f.

and I then define a typeclass, in order to write search functions etc
that operate on all trees.

:- typeclass tree(T) where [...].
:- instance tree(tree1(_,_)).
:- instance tree(tree2(_,_)).

and that I also want a procedure such as:

:- pred edge_label(T::in,E::out) is det.

to get the edge label (of whatever type) from the tree (of whatever sort).

Now, how do I tell the compiler that the E in the procedure is the
same as the E in the type class?

Attempt 1:

:- typeclass tree(T,E) where [ pred edge_label(T::in,E::out) is det ].
:- instance tree(tree1(_,E),E).
:- instance tree(tree2(_,E),E).

|Error: types in instance declarations must be functors with distinct
|variables as arguments: tree(tree1(_1, _2), _2).

Attempt 2:

:- typeclass tree(T) where [ pred edge_label(T::in,E::out) is det ].

|In clause for type class method implementation:
|  in argument 2 of predicate `edge_label/2':
|  type error: variable `HeadVar__2' has type `(some [E] E)',
|  expected type was `(some [E] E)'.

Any help appreciated.


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