<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-15"
 http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Dear all,<br>
<br>
<br>
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?<br>
<br>
Just an example:<br>
<br>
:-inst graphProblem ---><br>
    graphProblem(<br>
        %%  successor mapping:<br>
        pred(in, out) is nondet<br>
    ).<br>
<br>
:-type graphProblem(NodeT) ---><br>
    graphProblem(<br>
        successorMapping::pred(NodeT, NodeT)<br>
    ).<br>
<br>
<br>
:-typeclass graphProblemI(GP, NodeT)<br>
        <= ((GP -> NodeT), node(NodeT)) where [                  
                       <br>
    func getSuccessorMapping(SP::in(searchProblem))=<br>
        (pred(NodeT, NodeT)::out(pred(in,out) is nondet))<br>
        is det<br>
].<br>
<br>
:-type xGraphProblem ---> some [GP, NodeT] (<br>
    xGraphProblem(SP)<br>
    => graphProblemI(GP, NodeT)<br>
).<br>
<br>
<br>
For conversion, I use the modes in/out at the moment:<br>
<br>
:-func toXGraphProblem(GraphProblemT::in(graphProblem))=<br>
        (<b>xGraphProblem::out</b>) is det<br>
    <= graphProblemI(GraphProblemT, NodeT).<br>
<br>
:-some [SearchProblemT2, StateT2, ActionT2, CostT2]<br>
    func ofXGraphProblem(<b>xGraphProblem::in</b>)=<br>
        (GraphProblem::out(graphProblem)) is det<br>
    => graphProblemI(GraphProblemT, NodeT).<br>
<br>
<br>
I would rather prefer to use the modes as in the enclosed<br>
type's typeclass/inst - but at the moment, the following<br>
would lead to "wrong instantiatedness" (toXGraphProblem/1)<br>
and "inferred `failure'" determinism problems (ofXGraphProblem):<br>
<br>
:-func toXGraphProblem(GraphProblemT::in(graphProblem))=<br>
        (xGraphProblem::out(graphProblem)) is det<br>
    <= graphProblemI(GraphProblemT, NodeT).<br>
<br>
:-some [SearchProblemT2, StateT2, ActionT2, CostT2]<br>
    func ofXGraphProblem(xGraphProblem::in(graphProblem))=<br>
        (GraphProblem::out(graphProblem)) is det<br>
    => graphProblemI(GraphProblemT, NodeT).<br>
<br>
<br>
Altough it seems hard to imagine - might I have overseen a way<br>
to use existentially quantified types with a mode identical to the<br>
types they are enclosing?<br>
<br>
<br>
Thank you in advance and all the best,<br>
<br>
          Nick<br>
<br>
<br>
<br>
<br>
</body>
</html>