[mercury-users] passing higher-order modes to existentially typed data type wrappers

Jörg Roman Rudnick joerg.rudnick at t-online.de
Sun May 6 05:32:35 AEST 2007

Dear all,

I have another question about usage of existential types as wrappers:
How about types with non-trivial (e.g. higher-order) modes? Is there a
way to keep the modes of a contained type?

Just an example:

:-inst graphProblem --->
graphProblem(
%%  successor mapping:
pred(in, out) is nondet
).

:-type graphProblem(NodeT) --->
graphProblem(
successorMapping::pred(NodeT, NodeT)
).

:-typeclass graphProblemI(GP, NodeT)
<= ((GP -> NodeT), node(NodeT)) where [

func getSuccessorMapping(SP::in(searchProblem))=
(pred(NodeT, NodeT)::out(pred(in,out) is nondet))
is det
].

:-type xGraphProblem ---> some [GP, NodeT] (
xGraphProblem(SP)
=> graphProblemI(GP, NodeT)
).

For conversion, I use the modes in/out at the moment:

:-func toXGraphProblem(GraphProblemT::in(graphProblem))=
(*xGraphProblem::out*) is det
<= graphProblemI(GraphProblemT, NodeT).

:-some [SearchProblemT2, StateT2, ActionT2, CostT2]
func ofXGraphProblem(*xGraphProblem::in*)=
(GraphProblem::out(graphProblem)) is det
=> graphProblemI(GraphProblemT, NodeT).

I would rather prefer to use the modes as in the enclosed
type's typeclass/inst - but at the moment, the following
would lead to "wrong instantiatedness" (toXGraphProblem/1)
and "inferred `failure'" determinism problems (ofXGraphProblem):

:-func toXGraphProblem(GraphProblemT::in(graphProblem))=
(xGraphProblem::out(graphProblem)) is det
<= graphProblemI(GraphProblemT, NodeT).

:-some [SearchProblemT2, StateT2, ActionT2, CostT2]
func ofXGraphProblem(xGraphProblem::in(graphProblem))=
(GraphProblem::out(graphProblem)) is det
=> graphProblemI(GraphProblemT, NodeT).

Altough it seems hard to imagine - might I have overseen a way
to use existentially quantified types with a mode identical to the
types they are enclosing?

Thank you in advance and all the best,

Nick

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20070505/f68fb7da/attachment.html>