2016-11-07 5 views

ответ

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 миллион элементов).