Пожалуйста, объясните в самом простом, свободном от жаргона английском языке, "универсальном свойстве разворота"?

Я работаю через "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 - это точно такое же утверждение, просто вставляемое в язык начальных и конечных объектов в соответствии с характером анализа вещей с теорией категорий. Этот анализ ценен именно из-за его естественных обобщений.