Files
mercury/tests/hard_coded/higher_order_syntax.m
2021-06-27 18:03:04 +10:00

61 lines
1.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module higher_order_syntax.
:- interface.
:- import_module io.
:- import_module list.
:- pred main(io::di, io::uo) is det.
:- func map_f(func(X) = Y, list(X)) = list(Y).
:- mode map_f(func(in) = out is det, in) = out is det.
:- mode map_f(func(in) = out is semidet, in) = out is semidet.
:- pred map_p(pred(X, Y), list(X), list(Y)).
:- mode map_p(pred(in, out) is det, in, out) is det.
:- mode map_p(pred(in, out) is semidet, in, out) is semidet.
:- mode map_p(pred(in, out) is multi, in, out) is multi.
:- mode map_p(pred(in, out) is nondet, in, out) is nondet.
%---------------------------------------------------------------------------%
:- implementation.
:- import_module int.
:- import_module std_util.
main(!IO) :-
L1 = [1, 2, 3],
L2 = map_f((func(X::in) = (Y::out) is det :- Y = 2*X), L1),
map_p((pred(X::in, Y::out) is det :- Y = 2*X), L2, L3),
L4 = map_f((func(X2) = Y2 :- Y2 = 5*X2), L3),
L = map_f(func(X3) = 10*X3, L4),
Foldit =
( pred(IO0::di, IO::uo) is det :-
list.foldl(io.write_int, L, IO0, IO)
),
Foldit(!IO),
Write = io.write_string,
Write("\n", !IO),
( if doit(semidet_succeed) then
Write("Yes.\n", !IO)
else
Write("No.\n", !IO)
).
map_f(_, []) = [].
map_f(F, [H0 | T0]) = [F(H0) | map_f(F, T0)].
map_p(_, [], []).
map_p(P, [X | Xs], [Y | Ys]) :-
P(X, Y),
map_p(P, Xs, Ys).
:- pred doit(pred).
:- mode doit((pred) is semidet).
doit(P) :-
P.