:- 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).