[m-users.] Determinism error caused by instantiation error, not sure why.
Zoltan Somogyi
zoltan.somogyi at runbox.com
Mon Oct 31 10:17:49 AEDT 2022
2022-10-31 10:11 GMT+11:00 "Sean Charles (emacstheviking)" <objitsu at gmail.com>:
> The error:
>
> repl.m:738: In `take_gencall'(in, out, in, out, in, out):
> repl.m:738: error: determinism declaration not satisfied.
> repl.m:738: Declared `det', inferred `semidet'.
> repl.m:747: In clause for `take_gencall(in, out, in, out, in, out)':
> repl.m:747: warning: unification of `Out' and maybe.yes cannot succeed.
> repl.m:747: `Out' has instantiatedness `unique(no)'.
>
> The code:
>
> :- pred take_gencall(error_msg::in, maybe(snode)::out, s::in, s::out,
> lsnode::in, lsnode::out) is det.
>
> take_gencall(Er, Out, !S) -->
> ( if no_errors(!.S) then
> ( if [GC] then
> { Pos = snpos(GC) },
> ( if { GC = gencall(_, _, _) } then
> { Out = yes(GC) } <== line 747
> else
> cerror(Pos, Er, !S),
> { Out = no }
> )
> else
> premature(!S)),
> { Out = no }
> else
> { Out = no }
> ).
>
> For the life of me I don't understand why the line in bold is causing an error, why has Out become `unique(no)` and does that no refer to a general no or is it the no from the may() discriminated union, I just don't see my mistake. Sorry.
Because the code you are looking at is not what the compiler sees.
You have a misplaced close parenthesis. It *should* be just before the final "else",
but in actuality, it occurs just after "premature(!S)". So what the compiler sees
is a conjunction containing both (a) the code after the call to premature,
which is Out = no, and the if-then-else containing Out = yes(GC).
Zoltan.
More information about the users
mailing list