Пожалуйста, объясните в самом простом, свободном от жаргона английском языке, "универсальном свойстве разворота"?
Я работаю через "Real World Haskell", что привело к созданию бесплатного PDF-документа под названием "Учебник по универсальности и выразительности складок" . В нем говорится о том, что "складка" является "универсальной". Я борюсь с его определением "универсальный" и хотел бы услышать от тех, кто уже инвестировал время, переваривая его: Пожалуйста, объясните на простом, максимально свободном на английском языке английском языке, "универсальном свойстве складки",? Что это за "универсальная собственность" и почему это важно?
Спасибо.
Ответы
Ответ 1
(режим жаргона выключен: -)
Универсальное свойство - это всего лишь способ доказать, что два выражения равны. (Что подразумевается под термином "принцип доказательства жаргона".)
Универсальное свойство говорит, что если вы сможете доказать эти два уравнения
g [] = v
g (x:xs) = f x (g xs)
то вы можете заключить дополнительное уравнение
g = fold f v
Обратное также верно, но это тривиально, чтобы показать, просто расширив определение fold
. Универсальное свойство является гораздо более глубоким свойством (что является жаргонным способом сказать это менее очевидно, почему это правда.)
Причина, по которой это вообще интересно, заключается в том, что она позволяет избежать доказательств по индукции, чего почти всегда стоит избегать.
Ответ 2
документ определяет два свойства:
g [] = v
g (x : xs) = f x (g xs)
а затем заявляет, что fold
- это не только функция, которая удовлетворяет этим свойствам, но является единственной функцией, которая удовлетворяет этим свойствам. что он уникален в этом отношении, является тем, что делает его "универсальным" в том смысле, в котором используется бумага.
Ответ 3
Свойство, которое имеет fold, состоит в том, что это функция рекурсивного списка, которая эквивалентна всем другим функциям рекурсивного списка, если вы дадите ей правильные параметры.
Оно имеет это свойство, потому что оно принимает в качестве параметра функции, которые будут применяться к элементам в списке.
Например, если мы написали простую функцию суммы:
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
Я только что нашел новую (для меня) запись в Википедии "Универсальная собственность". Он проливает TON света на этот вопрос. Здесь ссылка:
Из этого я (в заключение) заключу следующее:
- Хотя вы можете подумать о 100 различных способах просмотра списка, вычисления по пути и создания одного конечного значения из списка, все 100 из этих способов изоморфны (что означает, что в конечном итоге они одинаковы). Существует только один способ уменьшить список до одного значения, а это FOLD.
- Fold также является "самым эффективным решением" для того, чтобы уменьшить список до одного значения. Или вы можете сказать, самое "факторизованное" или "упрощенное" решение.
Вместе, кажется, эти 2 точки фиксируют значение термина "универсальное свойство".
Ответ 5
Хотя это может быть немного трудно проследить, не прочитав предыдущие сообщения в серии, объясняющие универсальные свойства с категориальной точки зрения, этот пост дает подробное категорическое объяснение универсального свойства складки, а также карту и фильтр.
http://jeremykun.com/2013/09/30/the-universal-properties-of-map-fold-and-filter/
Хотя мне еще предстоит написать его, последующее будет обобщать это (и сделать его намного проще понять, хотя и более абстрактно), чтобы "свернуть" в общих структурах данных.
Подробнее см. это сообщение о том, что универсальное свойство: http://jeremykun.com/2013/05/24/universal-properties/
И здесь для ссылок на все сообщения в серии: http://jeremykun.com/main-content/
По правде говоря, принятый в настоящее время ответ - это самый простой способ понять, что говорит универсальная собственность о сворачивании. Связанные выше статьи просто дают более подробное техническое описание через теорию категорий, которая отсутствует в рассматриваемой статье. Однако я не согласен с утверждением в принятом ответе, что универсальное свойство гораздо более глубокое, чем утверждение, не содержащее жаргона. Универсальное свойство fold - это точно такое же утверждение, просто вставляемое в язык начальных и конечных объектов в соответствии с характером анализа вещей с теорией категорий. Этот анализ ценен именно из-за его естественных обобщений.