[m-users.] Inst problem

Volker Wysk post at volker-wysk.de
Sat Nov 1 21:45:41 AEDT 2025


Hi!

I have this:

------------
:- type iosupp.res(T)
    ---> ok(T)
    ;    error(iosupp.error).

:- inst iosupp.res(I)
    ---> ok(I)
    ;    error(ground).

:- type path ---> path(
    abs :: bool,
    comps :: list(string)
).

:- inst abs_path == bound(path(bound(yes), ground)).

:- pred absolute_path_p(path, iosupp.res(path),   io, io).
:- mode absolute_path_p(in,   out(res(abs_path)), di, uo) is det.

:- pred current_directory_p(
    iosupp.res(path)::out(iosupp.res(abs_path)), 
    io::di, io::uo
) is det.

absolute_path_p(Path, Res, !IO) :-
    (
        if   Path ^ abs = yes
        then Res = iosupp.ok(Path)
        else dirsupp.current_directory_p(Res1, !IO),
             (   
                 Res1 = ok(Cwd),
                 Res  = ok(path(yes, Cwd ^ comps ++ Path ^ comps))
             ;
                 Res1 = iosupp.error(Err),
                 Res  = iosupp.error(Err)
             )
    ).
------------

And I get this error message from the compiler:

iosupp.m:1065: In clause for `absolute_path_p(in,
out(iosupp.res(iosupp.abs_path)), di, uo)':
iosupp.m:1065:   mode error: argument 2 had the wrong instantiatedness.
iosupp.m:1065:   Final instantiatedness of `Res' was
iosupp.m:1065:     unique(
iosupp.m:1065:       error(ground)
iosupp.m:1065:     ;
iosupp.m:1065:       ok(
iosupp.m:1065:         bound(
iosupp.m:1065:           path(ground, ground)
iosupp.m:1065:         )
iosupp.m:1065:       )
iosupp.m:1065:     ),
iosupp.m:1065:   expected final instantiatedness was
iosupp.m:1065:     named inst res(abs_path)
iosupp.m:1065:     which expands to
iosupp.m:1065:       bound(
iosupp.m:1065:         error(ground)
iosupp.m:1065:       ;
iosupp.m:1065:         ok(
iosupp.m:1065:           named inst abs_path
iosupp.m:1065:           which expands to
iosupp.m:1065:             bound(
iosupp.m:1065:               path(
iosupp.m:1065:                 bound(
iosupp.m:1065:                   yes
iosupp.m:1065:                 ),
iosupp.m:1065:                 ground
iosupp.m:1065:               )
iosupp.m:1065:             )
iosupp.m:1065:         )
iosupp.m:1065:       ).


I think I understand the final instantiatedness of `Res', and that it
doesn't match the mode line for absolute_path_p. But how *should* it be
done?

TIA,
Volker


More information about the users mailing list