[mercury-users] Question

Gustavo A. Ospina gos at info.fundp.ac.be
Fri Aug 20 21:29:45 AEST 1999


At 17:08 20/08/99 +1000, Maria Garcia de la Banda wrote:
>
>Hi, 
>
>I am trying to define a predicate which among other things receives a
>function as first argument, applies something to it, and returns the
>resulting function. For example:
>
>:- mode out(T) :: new -> T.
>
>:- pred try(func(int,int)=int,int,func(int) = int).
>:- mode try(func(in,in) = out is det,in,out(func(in) = out is det)) is det.
>
>try(X,Y,Z):-
>        Z = apply(X,Y).
>

I've try the solution

try(X,Y,Z):-
        Z = X(Y).

But the compiler still rejects this. It seems to be a problem in
unification of higher-order terms with higher order modes (but I don't have
a rigorous explanation). It seems to be necessary to express the
currification explicitely using lambda terms, like this :

try(X, Y, Z) :-
	Z = (func(A::in) = (B::out) is det :- B = X(Y, A)).

It compiles, but it shows there are something strange since the first
solutions didn't compile.

Hope this helps.

+ Gustavo.
--------------------------------------------------------------------------
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