Свойство, которое имеет сгиб, состоит в том, что оно является функцией рекурсивного списка, которая эквивалентна всем другим функциям рекурсивного списка, если вы дадите ей правильные параметры.
Оно имеет это свойство, поскольку оно принимает в качестве параметра функции, которые будут применяться к элементам в списке.
Например, если мы написали простую функцию суммы:
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)
И, следовательно, все вещи, которые были доказаны о складке, также доказаны верно для моей функции ForAll и все его использование в моей программе. (Обратите внимание, что нам не нужно даже рассматривать, какая функция c предоставляется в каждом из разных вызовов для forall и foldl, это не имеет значения!)
4 года с тех пор, как я спросил, и только сегодня вечером я наткнулся на статью, говорящую об этом.Я не знаю, будет ли он полностью отвечать на мой вопрос, но это определенно связано. Найти этот URL-адрес для «универсальной собственности»: http://jeremykun.com/2013/04/16/categories-whats-the-point/ –
Смешно, четыре года назад я не знал, что такое универсальная собственность. Теперь я пишу эту серию сообщений в блогах. Какое совпадение я столкнулся с этим при написании более подробного сообщения об универсальных свойствах. Должно быть сделано на следующей неделе. – JeremyKun
@Bean, рад это слышать! Я буду с нетерпением ждать его чтения. Потому что, хотя я начинаю понимать, я все еще очень долго не могу утверждать, что я глубоко понимаю, что такое универсальная собственность. –