Re: [m-users.] Mode and inst confusion in ODBC library

Julien Fischer <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <[email protected]>

On Tue, 8 Aug 2023, Volker Wysk wrote:

> Hi
>
> In the ODBC extra library, there's this:
>
> -----snip-----
> :- type odbc.transaction(T) ==  pred(T, odbc.state, odbc.state).
> :- mode odbc.transaction ==  (pred(out, di, uo) is det).
>
> % ...
>
> :- pred odbc.transaction(data_source::in, user_name::in, password::in,
>    transaction(T)::transaction,
>    odbc.result(T)::out, io::di, io::uo) is det.
> -----snip-----
>
> The mode of the fourth argument of the predicate is a (higher order) inst,
> not a mode - ?? According to Ralph Becket's Mercury tutorial, the mode of an
> argument is a mapping from the instantiation before the call to after the
> call of the predicate. And it's written "Before >> After" (or defined this
> way).

From section 9.4 "Higher-order insts and modes" of the reference manual:

     As a convenience, the language allows you to write a higher order mode
     using the same syntax as a higher order inst. If HOInst has the form of
     a higher order inst, then writing HOInst where a mode is required is the
     same as writing ‘in(HOInst)’, which is in turn equivalent to ‘HOInst >>
     HOInst’. Therefore, you can omit ‘in()’ around the higher order inst of
     an input argument. For example,

         :- mode foldl(in(pred(in, in, out) is det), in, in, out) is det.

     can also be written as

         :- mode foldl(pred(in, in, out) is det, in, in, out) is det.

     though the former may be easier to understand.

Julien.

_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.