[mercury-users] Re: coloured petri nets
Ralph Becket
rbeck at microsoft.com
Thu Sep 6 20:26:12 AEST 2001
> From: Peter Ross [mailto:peter.ross at miscrit.be]
> Sent: 06 September 2001 10:30
>
> :- func bind(int) = int.
>
> bind(X) = 2 * X.
>
> main -->
> { Place = p(set__list_to_set([1,2,3])) },
> { P = existential_place(Place) },
> (
> { f(P, bind, X) },
> { X = 6 }
> ->
> io__write_string("Hi\n")
> ;
> io__write_string("Bye\n")
> ).
>
========================================================================
======
>
> main.m:033: In clause for predicate `main:main/2':
> main.m:033: in argument 2 of call to predicate `f/3':
> main.m:033: type error: argument has type `((func int) = int)',
> main.m:033: expected type was `((func T) = int)'.
> For more information, try recompiling with `-E'.
>
> I will now have a play with Fergus' approach.
The problem is that bind/1 is not polymorphic - you can't know
at compile time what type T it's going to be applied to.
Perhaps a better solution is to change things as follows:
:- typeclass token(T) where [
func env(T) = int
].
:- typeclass place(P) where [
func name(P) = string,
some [T] pred token(P, T) => token(T),
mode token(in, out) is nondet
].
%...define token/1 instances as appropriate...
:- instance token(int) where [ env(I) = I ].
main -->
{ P = existential_place(p(list_to_set([1, 2, 3]))) },
( if
{ token(P, T) },
{ env(T, X) },
{ X = 6 }
then
io__write_string("Hi\n")
else
io__write_string("Bye\n")
).
- Ralph
--------------------------------------------------------------------------
mercury-users mailing list
post: mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the users
mailing list