[mercury-users] type class constrain problem

Andrea Bini andrea.bini at studenti.unimi.it
Fri Aug 3 21:01:31 AEST 2007

hi all!
suppose you have two modules, one declaring:

:- typeclass c1(T) where [ ].
:- instance c1(tc1_1) where [ ].
:- instance c1(tc1_2) where [ ].

:- type tc1_1 ---> foo.
:- type tc1_2 ---> bar.

:- type t1 ---> some [T] t1(T) => c1(T).

   %  t2 contains constructors for all and only the types of class c1
:- type t2 ---> fooc(tc1_1)
                    ; barc(tc1_2).

and the other one that needs to construct a term of type t1 from a t2 term
but without explicitly nominate t2 constructors (i.e. needs to work without
being rewritten if declarations in the first module change). Writing a
predicate as the following doesn't work becouse the compiler says that the
type class constrain is unsatisfiable:

:- pred t2_to_t1(t2::in, t1::out) is semidet.
t2_to_t1(T2,T1) :-
  type_ctor_and_args(type_of(T2), _, [X_desc]),
  has_type(X, X_desc),
  T1 = 'new t1'(X).

my question is: I need to write a predicate, that does the same thing of
t2_to_t1, in the first module but specific to the particular t2 keeping it
updated if declarations are changed, like this:

:- pred t2_to_t1(t2::in, t1::out) is det.
t2_to_t1(fooc(X), 'new t1'(X)).
t2_to_t1(barc(X), 'new t1'(X)).

or there is a way to modify the generic t2_to_t1 and let it works?

best regards!

Andrea Bini

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