Свойство, которое имеет сворачивание, состоит в том, что это функция рекурсивной рассылки, которая эквивалентна всем другим функциям рекурсивной рассылки, если вы зададите ей правильные параметры.
У него есть это свойство, поскольку он принимает в качестве параметра функции, которые будут применяться к элементам в списке.
Например, если мы написали простую функцию суммы:
sum [] = 0
sum (head:tail) = head + (sum tail)
тогда мы могли бы вместо этого написать ее как функцию сгиба, передав оператор (+), который мы хотим использовать для объединения элементов:
sum list = foldl (+) 0 list
Таким образом, любая функция, которая действует просто и рекурсивно над списком, может быть переписана как функция сгиба. Эта эквивалентность является свойством. Я полагаю, что он называет это свойство универсальным, потому что оно работает над всеми этими без исключения рекурсивными алгоритмами с линейным списком.
И, как он объясняет, причина, по которой это свойство так полезно, состоит в том, что, поскольку мы можем показать, что все эти другие алгоритмы фактически эквивалентны свертыванию, доказав что-то о сворачивании, мы также докажем это для всех этих других алгоритмов. *
Мне лично было трудно понять функцию сгиба, поэтому иногда я использовал свою собственную, которая выглядит следующим образом:
-- forall - A kind of for next loop
-- list is list of things to loop through
-- f is function to perform on each thing
-- c is the function which combines the results of f
-- e is the thing to combine to when the end of the list is reached
forall :: [a] -> (a->b) -> (b->b->b) -> b -> b
forall [] f c e = e
forall (x:xs) f c e = c (f x) (forall xs f c e)
(На самом деле это немного мощнее, чем foldl, поскольку он имеет дополнительную функцию применения функции f к каждому элементу в списке.)
Ну, никто ничего не доказал в моей функции. Но это не имеет значения, потому что я могу показать, что моя функция на самом деле является функцией сгиба:
forall l f c e = foldl c e (map fn l)
И, следовательно, все то, что было доказано относительно сгиба, также подтверждено для моей функции поиска и всех ее применений в моей программе. (Обратите внимание, что нам даже не нужно учитывать, какая функция c предоставляется в каждом из различных вызовов forall и foldl, это не имеет значения!)