mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
40 lines
1.1 KiB
Mathematica
40 lines
1.1 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% This is a regression test. Earlier versions of the compiler did not notice
|
|
% that Acc0 is an input parameter of the lambda expression and thus did not
|
|
% detect that the disjunction is a switch on Acc0.
|
|
|
|
:- module lambda_switch.
|
|
|
|
:- interface.
|
|
|
|
:- import_module maybe.
|
|
|
|
:- type agg_func(T, S)
|
|
---> agg(S, func(S, T) = S).
|
|
:- inst agg_mode == bound(agg(ground, func(in, in) = out is det)).
|
|
:- mode agg_in == agg_mode >> agg_mode.
|
|
:- mode agg_out == free >> agg_mode.
|
|
|
|
:- func min(func(T) = int) = agg_func(T, maybe(int)).
|
|
:- mode min(func(in) = out is det) = agg_out is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module int.
|
|
|
|
min(F) = agg(no, M) :-
|
|
M =
|
|
( func(Acc0, Val0) = Acc :-
|
|
Val = apply(F, Val0),
|
|
(
|
|
Acc0 = no,
|
|
Acc = yes(Val)
|
|
;
|
|
Acc0 = yes(Acc1),
|
|
( Acc1 < Val -> Acc = yes(Acc1) ; Acc = yes(Val))
|
|
)
|
|
).
|