[m-users.] How to abbreviate a higher order mode?

Volker Wysk post at volker-wysk.de
Thu Apr 2 01:23:45 AEDT 2026


Thank you very much.

Volker


Am Donnerstag, dem 02.04.2026 um 01:03 +1100 schrieb Julien Fischer:
> Hi,
> 
> On Thu, 2 Apr 2026 at 00:43, Volker Wysk <post at volker-wysk.de> wrote:
> > 
> > Hi!
> > 
> > I have higher-order arguments with lengthy types and modes, such as:
> > 
> >     pred(fis_args, list(string), master_loop_data, master_loop_data, io,
> > io)
> >     ::in(pred(in, in, in, out, di, uo) is cc_multi),
> > 
> > Now I want to abbreviate it, so it becomes something like this:
> > 
> >     master_prepare::in(master_prepare),
> > 
> > I've tried this:
> > 
> > :- type master_prepare ==
> >     pred(fis_args, list(string), master_loop_data,
> >     master_loop_data, io, io).
> > 
> > :- inst master_prepare == pred(in, in, in, out, di, uo).
> > 
> > The inst doesn't work - the right side is a mode, not an inst. This
> > doesn't
> > work either:
> 
> That doesn't work for two reasons:
> 
> 1. The RHS is not a mode nor an inst. A higher-order inst  needs to
> both describe the modes
> of the arguments *and* the determinism (i.e. you've left out "is
> cc_multi").
> 
> 2. The second reason is that due to the relative precedence of the
> "==" and "is" operators
> you need to enclose the RHS in parenthesis.
> 
> It should be:
> 
>      :- inst master_prepare == (pred(in, in, in, out, di, uo) is
> cc_multi).
> 
> (See the "Higher-order insts and modes" section of the reference manual.)
> 
> Julien.


More information about the users mailing list