[mercury-users] Puzzled about about I/O in predicates which may fail

Ralph Becket rafe at cs.mu.OZ.AU
Wed Nov 24 13:55:12 AEDT 2004

Gregory D. Weber, Tuesday, 23 November 2004:
> It seems to me that by using state variables, I can "fix" an
> error involving I/O in predicates which may fail.
> If read_problem_decl_semidet is indeed semidet, then
> main(!IO) :-
> 	(
> 	  read_problem_decl_semidet("credit.decl", Problem, !IO) ->
> 	  describe_problem(Problem, !IO)
> 	;
> 	  io__print("Error reading file\n", !IO)
> 	).
> compiles without any error message.  Moreover, running the program
> actually works!

Which version of the Mercury compiler are you using?  I just tried to
compiler the following module using a recent ROTD:

:- module foo.
:- interface.
:- import_module io.

:- pred main(io :: di, io :: uo) is det.

:- implementation.
:- import_module std_util, string.

main(!IO) :-
    ( if p(!IO) then io.print("yes\n", !IO) else io.print("no\n", !IO) ).

:- pred p(io::di, io::uo) is semidet.

p(!IO) :-

and obtained the following (correct) error message:

Making Mercury/int3s/foo.int3
Making Mercury/cs/foo.c
foo.m:014: In `p(di, uo)':
foo.m:014:   error: invalid determinism for a predicate with I/O state
foo.m:014:   arguments.
foo.m:011: In clause for `main(di, uo)':
foo.m:011:   in argument 1 of call to predicate `foo.p/2':
foo.m:011:   mode error: variable `STATE_VARIABLE_IO_0' has instantiatedness `mostly_unique',
foo.m:011:   expected instantiatedness was `unique'.
For more information, try recompiling with `-E'.
** Error making `Mercury/cs/foo.c'.

-- Ralph
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list