[mercury-users] Uniqueness modes etc

Fergus Henderson fjh at cs.mu.OZ.AU
Mon Dec 29 09:14:52 AEDT 2003

On 24-Dec-2003, Dr Mark H Phillips <mark at austrics.com.au> wrote:
> Is it possible to have a variable, x say, and send it into a function
> using the di mode, and extract it out again using the uo mode?


> Now I am assuming that you can do some form of currying in Mercury.
> Suppose we have some:
>   :- pred r(int, int, int, int).
>   :- mode r(di, uo, in, out) is det.
>   r(x, y, n, fn) :- ....
> (please excuse me if I've got the syntax wrong)

Variable names in Mercury start with a capital letter,
so this should be

	r(X, Y, N, Fn) :- ....

but otherwise that is fine.

> Now suppose we form a "curried" form of this:
>   let q(n, fn) be r(x, y, n, fn) where x and y have both been set to
>   some variable x_0.

The Mercury syntax for this would be

	X = X_0,
	Y = X_0,
	Q = (pred(N::in, Fn::out) is det :- r(X, Y, N, Fn))

> Now presumably q could be "applied" to several different n, producing
> in turn several different fn.  Now r is referentially transparent,
> but because q has uniqueness modifying behaviour hidden away inside
> the "currying", q acts as if it is referentially opaque.  Ie, on each
> application, x_0 may be modified, potentially giving rise to different
> q behaviour down the track.

Indeed, if code like this was allowed, that would be a problem.

> My question is: can this form of "pseudo opacity" actually happen inside
> Mercury?

No.  Code like the above is not allowed.  You can't partially apply
a procedure if the partially applied arguments have "di" modes.
You will get a mode error (well, actually a uniqueness error),
e.g. something like this one:

	in argument 1 of call to predicate `f.r/4':
	mode error: variable `X' has instantiatedness `ground',
	expected instantiatedness was `unique'.

> And what is the best way of thinking about these issues?  Ie,
> this kind of behaviour can be quite useful -- certainly in C++ it can
> be -- is it a problem or is it theoretically fine?  Or should I be
> modelling this kind of thing differently.

If you _want_ this kind of behaviour, then I think the right way of modelling
it in Mercury would probably be to use a "mutvar" -- see the "store" module
in the Mercury standard library.  Feel free to ask if you have any questions
about this approach.

Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
The University of Melbourne         |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
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