[m-dev.] ui arguments in closures

Mark Brown mark at csse.unimelb.edu.au
Mon Jun 23 16:30:30 AEST 2008

On 23-Jun-2008, Ralph Becket <rafe at csse.unimelb.edu.au> wrote:
> This is pertinent to G12.
> I have a predicate
> :- pred output_environment(solver::in, env::in, ps::ui, io::di, io::uo) is det.
> output_environment(Solver, Env, PS, !IO) :-
>     map.foldl(output_env_var(Solver, PS), Env, !IO).	% --- Line 1023 ---
> :- pred output_env_var(solver::in, ps::ui, name::in, value::in, io::di, io::uo)
> 	is det.
> ...
> The compiler is complaining thus:
> flatzinc_solver.m:1023: In clause for `output_environment(in, in, ui, di, uo)':
> flatzinc_solver.m:1023:   in argument 2 of call to predicate
> flatzinc_solver.m:1023:   `flatzinc_solver.output_env_var'/6:
> flatzinc_solver.m:1023:   mode error: variable `PS' has instantiatedness
> flatzinc_solver.m:1023:   `ground',
> flatzinc_solver.m:1023:   expected instantiatedness was `unique'.
> Do I take it that ui arguments in closures are treated as ground by the
> compiler?  If so, is this a bug or is there a reason for this behaviour?

It is not a bug -- the PS argument is no longer unique.  That is, the
compiler can't guarantee that you won't call the closure after somebody
else has destructively updated PS.

To do a foldl with a ui parameter, you need a version like this:

	:- pred foldl_ui(pred(S, T, A, A)::in(pred(ui, in, in, out) is det),
		S::ui, list(T)::in, A::in, A::out) is det.

	foldl_ui(Pred, PS, Ts, !Acc) :-
	        Ts = []
	        Ts = [T0 | Ts0],
	        Pred(PS, T0, !Acc),
	        foldl_ui(P, PS, Ts0, !Acc)

(I know this is over a list, not a map, but you get the picture.)


mercury-developers mailing list
Post messages to:       mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions:          mercury-developers-request at csse.unimelb.edu.au

More information about the developers mailing list