[m-users.] Insts of tuple types?
Peter Wang
novalazy at gmail.com
Mon Aug 7 17:38:47 AEST 2023
On Sun, 06 Aug 2023 19:37:53 +0200 Volker Wysk <post at volker-wysk.de> wrote:
> Hello.
>
> I have an argument of this type:
>
> maybe(
> { (pred(io, io)),
> place_data
> }
> )
>
> I need to specify a higher order inst because the first component is a
> predicate. What is the inst? This inst doesn't work:
>
> :: out(
> maybe(
> { pred(di, io) is det,
> ground
> }
> ))
>
> I get this error message:
>
> amend.m:099: In declaration of predicate `amend_new_file_place'/5:
> amend.m:099: error: undefined inst `{}'/2.
It's written:
bound({ ArgInst1, ArgInst2 })
which is the same as:
bound('{}'( ArgInst1, ArgInst2 )
In a inst definition you can write:
:- inst tuple
---> { ArgInst1, ArgInst2 }.
which is the same as:
:- inst tuple
---> '{}'( ArgInst1, ArgInst2 ).
BTW, in case you haven't seen the chapter on Combined higher-order types
and insts, you can define a type with a higher-order argument type with
insts:
:- type pred_wrapper
---> pred_wrapper(pred(io::di, io::uo) is det).
When you take the argument out of a pred_wrapper term, it will have
the higher-order inst, so you can call it:
Wrapper = pred_wrapper(P),
P(!IO)
This will save you having to specify higher-order insts everywhere.
Peter
More information about the users
mailing list