Как называется оператор сокращения в списках в ATS?

Скажем, я хочу суммировать целые числа в списке. Я могу сделать это, применив к списку оператор сокращения с начальным значением 0 и функцию сложения. Как называется оператор сокращения в ATS?


ats
person Community    schedule 07.11.2016    source источник


Ответы (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