[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.
/Tomas
--------------------------------------------------------------------------
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