Свойство fold состоит в том, что это функция рекурсии списка, которая эквивалентна всем другим функциям рекурсии списка, если вы зададите ей правильные параметры.
У него есть это свойство, потому что он принимает в качестве параметра функции, которые будут применяться к элементам в списке.
Например, если мы написали простую функцию суммирования:
sum [] = 0
sum (head:tail) = head + (sum tail)
тогда мы могли бы вместо этого написать это как функцию fold, передав оператор (+), который мы хотим использовать для объединения элементов:
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 к каждому элементу в списке.)
Ну никто ничего не доказал о моей функции. Но это не имеет значения, потому что я могу показать, что моя функция на самом деле является функцией fold:
forall l f c e = foldl c e (map fn l)
И, следовательно, все, что было доказано в отношении fold, также подтверждается для моей функции forall и всех ее применений в моей программе. (Обратите внимание, что нам даже не нужно рассматривать, какая функция c предоставляется в каждом из различных вызовов forall и foldl, это не имеет значения!)
person
joeytwiddle
schedule
10.05.2009