[m-dev.] Suggestion for a new "where" operator
Fergus Henderson
fjh at cs.mu.OZ.AU
Fri Aug 8 18:58:30 AEST 2003
On 07-Aug-2003, Peter Moulder <pmoulder at mail.csse.monash.edu.au> wrote:
> [Interestingly, the two versions of the goal can have different
> determinisms (or even produce a mode error in the duplicate-where
> version) if the first p call changes the instantiatedness of X. E.g. if
> (p(out) is det) is chosen for the initial p(X) call (i.e. p(free >>
> ground) is det), then the second p(X) call in the duplicate-where
> version can resolve to (p(in) is semidet), and the compiler may
> (over-cautiously) complain that the goal can fail.]
The same applies to ordinary functions like "+".
For instance, in the following example,
:- func foo(int) = int.
foo(X) = Y :-
q(X + Y, X + Y).
:- pred q(int::out, int::out) is det.
q(Z, Z) :- Z = 42.
the second call to `+' will result in a determinism error,
because the first call to `+' has bound `Y'.
I don't see this as a significant problem, because it is easy
to rewrite such code in a way that avoids the determinism error.
In so far as this issue is a problem for where expressions, I think it
would in the main part be resolved by adopting scoping rules analagous
to those for lambda expressions, as I suggested in one of my earlier
posts, so that variables which occur only within `where' expressions
are scoped locally to those `where' expressions.
--
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-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list