RosettaCodeData/Task/Greatest-subsequential-sum/ATS/greatest-subsequential-sum.ats

72 lines
1.1 KiB
Plaintext

(*
** This one is
** translated into ATS from the Ocaml entry
*)
(* ****** ****** *)
//
// How to compile:
// patscc -DATS_MEMALLOC_LIBC -o maxsubseq maxsubseq.dats
//
(* ****** ****** *)
//
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
typedef ints = List0(int)
(* ****** ****** *)
fun
maxsubseq
(xs: ints): (int, ints) = let
//
fun
loop
(
sum: int, seq: ints
, maxsum: int, maxseq: ints, xs: ints
) : (int, ints) =
(
case+ xs of
| nil () =>
(
maxsum
, list_vt2t(list_reverse(maxseq))
) (* end of [nil] *)
| cons (x, xs) => let
val sum = sum + x
and seq = cons (x, seq)
in
if sum < 0
then loop (0, nil, maxsum, maxseq, xs)
else (
if sum > maxsum
then loop (sum, seq, sum, seq, xs)
else loop (sum, seq, maxsum, maxseq, xs)
) (* end of [else] *)
end // end of [cons]
)
//
in
loop (0, nil, 0, nil, xs)
end // end of [maxsubseq]
implement
main0 () = () where
{
val
(maxsum
,maxseq) =
maxsubseq
(
$list{int}(~1,~2,3,5,6,~2,~1,4,~4,2,~1)
)
//
val () = println! ("maxsum = ", maxsum)
val () = println! ("maxseq = ", maxseq)
//
} (* end of [main0] *)