Скажем, я хочу суммировать целые числа в списке. Я могу сделать это, применив к списку оператор сокращения с начальным значением 0 и функцию сложения. Как называется оператор сокращения в ATS?
Как называется оператор сокращения в списках в ATS?
Ответы (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 миллион элементов).
person
Hongwei Xi
schedule
08.11.2016