RosettaCodeData/Task/Variables/Mercury/variables-7.mercury

24 lines
699 B
Plaintext

:- type accumulator == (pred(int, int, io, io)).
:- inst accumulator == (pred(in, out, di, uo) is det).
:- func accumulator >> accumulator = accumulator.
:- mode in(accumulator) >> in(accumulator) = out(accumulator).
A >> B = C :-
C = (pred(!.N::in, !:N::out, !.IO::di, !:IO::uo) is det :-
A(!N, !IO),
B(!N, !IO)).
:- pred add(int::in, int::in, int::out, io::di, io::uo) is det.
add(N, !Acc, !IO) :-
io.format("adding %d to accumulator (current value: %d)\n",
[i(N), i(!.Acc)], !IO),
!:Acc = !.Acc + N.
:- pred example2(io::di, io::uo) is det.
example2(!IO) :-
F = add(5)
>> add(5)
>> add(-10),
F(0, X, !IO),
io.print_line(X, !IO).