Скажем, я хочу подытожить целые числа в списке. Я могу сделать это, применив оператор сокращения в списке с начальным значением 0 и функцией добавления. Как называется оператор сокращения в ATS?Как называется оператор сокращения по спискам в ATS?
1
A
ответ
1
Название «уменьшить» немного неоднозначно. Это может означать либо сокращение, либо уменьшение. В ATS «сокращение» называется «сгибом». Есть «foldleft» и «foldright», где первый имеет хвостовую рекурсивность, а второй - нет. Например, sumup
может быть реализован следующим образом:
//
fun
sumup(xs: list0(int)): int =
(xs).foldleft(TYPE{int})(0, lam(r, x) => r+x)
//
// If dot-notation is to be spared, please write:
fun
sumup(xs: list0(int)): int =
list0_foldleft<int><int>(xs, 0, lam(r, x) => r+x)
//
Можно также использовать foldright:
fun
sumup(xs: list0(int)): int =
(xs).foldright(TYPE{int})(lam(r, x) => r+x, 0)
, но эта версия sumup
может потенциально вызвать переполнение стека, если xs
очень длинный список (например, содержащий 1 миллион элементов).