Чтобы прояснить вопрос: «сумма квадратов» - это специальная функция, потому что она обладает свойством, которое может быть выражено через функционал сгиба плюс лямбда, то есть
sumSq = fold ((result, next) => result + next * next) 0
Какие функции f
имеют это свойство, где dom f = { A tuples }
, ran f :: B
?
Очевидно, что из-за механики сгиба утверждение о том, что f складывается, является утверждением, что существует h :: A * B -> B
такое, что для любого n> 0, x1, ..., xn в A, f ((x1,...xn)) = h (xn, f ((x1,...,xn-1)))
.
Утверждение, что h
существует, говорит почти то же самое, что и ваше состояние, что
f((x1, x2, ..., xn)) = f((f((x1, x2, ..., xn-1)), xn)) (*)
так что вы были почти правы; разница в том, что вам требуется A=B
, что немного более ограничительно, чем обычная функция, выражаемая сгибом. Что еще более проблематично, сгиб обычно также принимает начальное значение a
, которое установлено на a = f nil
. Основная причина, по которой ваша формулировка (*) неверна, состоит в том, что она предполагает, что h - это то, что f делает в списках пар, но это верно только тогда, когда h(x, a) = a
. То есть в вашем примере суммы квадратов начальное значение, которое вы задали для Accumulate, было 0, что при добавлении ничего не дает, но есть функции с выражением в виде сгиба, где начальное значение что-то делает, и в этом случае мы иметь выражаемую в сгибе функцию, которая не удовлетворяет (*).
Например, возьмите эту выражаемую фолдом функцию lengthPlusOne
:
lengthPlusOne = fold ((result, next) => result + 1) 1
f (1) = 2
, но f(f(), 1) = f(1, 1) = 3
.
Наконец, давайте приведем пример функций в списках, не выражаемых в терминах свертывания. Предположим, у нас была функция черного ящика и мы проверили ее на следующих входах:
f (1) = 1
f (1, 1) = 1 (1)
f (2, 1) = 1
f (1, 2, 1) = 2 (2)
Такая функция для кортежей (= конечных списков), очевидно, существует (мы можем просто определить ее так, чтобы эти выходы были выше и были равны нулю в любых других списках). Тем не менее, это не складывается, потому что (1) подразумевает h(1,1)=1
, в то время как (2) подразумевает h(1,1)=2
.
Я не знаю, есть ли другая терминология, кроме просто сказать «функция, выражаемая как складка». Возможно, (слева / справа) функция списка без контекста будет хорошим способом ее описания?