Files
mercury/tests/hard_coded/higher_order_syntax.m
2020-10-05 17:53:05 +11: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.
:- import_module std_util.
:- 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.
main -->
{ 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,
{ Write = io.write_string },
Write("\n"),
( if { doit(semidet_succeed) } then
Write("Yes.\n")
else
Write("No.\n")
).
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.