Схемы рекурсии для манекенов?

Я ищу некоторые действительно простые, легкие для понимания объяснения схем рекурсии и схем коревразии (катаморфизмы, анаморфизмы, гиломорфизмы и т.д.), которые не требуют следующих партий ссылок или открытия учебника теории категорий. Я уверен, что я заново изобрел многие из этих схем бессознательно и "применил" их в своей голове во время процесса кодирования (я уверен, что многие из нас есть), но я не знаю, что такое (ко) рекурсионные схемы я вызывается. (Хорошо, я соврал. Я только что читал о некоторых из них, что вызвало этот вопрос. Но до сегодняшнего дня я понятия не имел.)

Я думаю, что распространение этих понятий в рамках сообщества программирования было затруднено запрещающими объяснениями и примерами, которые, как правило, сталкиваются - например, в Википедии, но и в других местах.

Это также, вероятно, мешало их имена. Я думаю, что есть несколько альтернативных, менее математических имен (что-то о бананах и колючей проволоке?), Но я не знаю, что имена cutsier для схем рекурсии, которые я использую.

Я думаю, что это поможет использовать примеры с типами данных, представляющими простые проблемы реального мира, а не абстрактные типы данных, такие как бинарные деревья.

Ответ 1

Чрезвычайно слабо говоря, катаморфизм - это просто небольшое обобщение fold, а анаморфизм - небольшое обобщение unfold. (И гиломорфизм просто разворачивается, а затем складывается.). Обычно они представлены в более строгой форме, чтобы сделать связь с категорией более понятной. Более плотная форма позволяет нам различать данные (обязательно конечное произведение исходной алгебры) и codata (возможно, бесконечное произведение конечной коалгебры). Это различие позволяет нам гарантировать, что фолд никогда не вызывается в бесконечном списке. Другая причина смешного способа описания катаморфизмов и анаморфизмов заключается в том, что, работая над F-алгебрами и F-коалгебрами (сгенерированными из функторов), мы можем писать их раз и навсегда, а не один раз над списком, двоичное дерево и т.д. Это, в свою очередь, помогает четко понять, почему они все те же.

Но с чистой точки зрения интуиции вы можете думать о том, что ката и ana - как сокращение и производство, так и это.

Изменить: немного больше

Метаморфизм (Гиббонс) похож на наизнанку hylo - его складку, за которой следует разворот. Таким образом, вы можете использовать его для срыва потока и создания нового с потенциально различной структурой.

Ekmett опубликовал красивое "полевое руководство" к различным схемам литературы: http://comonad.com/reader/2009/recursion-schemes/

Однако, хотя "интуитивные" объяснения просты, связанный код в меньшей степени, и сообщения в блогах по некоторым из них могут быть немного сложными/запрещающими.

Тем не менее, за исключением, возможно, для гистоморфизмов, я не думаю, что остальная часть зоопарка - это то, о чем вы хотели бы думать напрямую в большинстве случаев. Если вы "получите" hylo и meta, вы можете выражать почти что-либо в терминах их в одиночку. Как правило, другие морфизмы более ограничительны, не менее (но, следовательно, дают вам больше свойств "бесплатно" ).

Ответ 2

Несколько ссылок, из самых категориальных (но имеющих отношение к "карте территории", которые позволят вам "просто нажимать на множество ссылок" ) на более простой и более автономный:

  • Что касается словарного запаса "бананы и колючая проволока", это происходит от оригинальной работы Мейера, Фокинга и Паттерсона (и его продолжение другими авторами), и это суммируется так же, как и нотация, как менее симпатичные альтернативы: "имена" (бананы и т.д.) являются просто ярлыком для графического появления ascii-обозначений конструкций они привязаны к. Например, катаморфизмы (т.е. Складки) представлены с (| _ |), а пар-с-скобкой выглядит как "банан", отсюда и название. Это газета, которую чаще всего называют "непроницаемой", следовательно, не первое, что я искал бы, если бы я был вами.

  • Основная ссылка для этих схем рекурсии (точнее, для реляционного подхода к этим схемам рекурсии) - это Bird and de Moor Алгебра Программирование (книга недоступна, кроме как для печати по требованию, но есть копии из вторых рук, и они должны быть в библиотеках). В нем содержится более подробное и подробное объяснение программирования без ограничений, если оно еще "академическое": книга вводит некоторый теоретико-теоретический словарь, хотя и в автономном режиме. Тем не менее, упражнения (которые вы не нашли в бумаге) помогут.

  • Сортировка морфизмов Lex Augustjein, использует алгоритмы сортировки по различным структурам данных для объяснения схем рекурсии. Это в значительной степени "схемы рекурсии для манекенов" по ​​построению:

    Эта презентация дает возможность ввести различные морфизмы в простой способ, а именно, как модели рекурсии, которые полезны в функциональном программировании, вместо обычного подхода через теорию категорий, которая, как правило, бесполезна запугивает для среднего программиста.

  • Еще один подход к созданию безсимвольной презентации - глава "Программирование оригами" Джереми Гиббонса в "Fun of Programming" , с некоторым совпадением с предыдущим. Его библиография дает обзор введения в эту тему.

    Изменить: Джереми Гиббонс просто сообщите мне, что он добавил ссылку на библиографию всей книги на веб-страницу книги после прочтения этого вопроса. Наслаждайтесь!

Я боюсь, что эти последние две ссылки дают простое объяснение (cata | ana | hylo | para) морфизмов, но я надеюсь, что этого будет достаточно, чтобы прорваться через алгебраический формализм, который вы можете найти в большей нотации - тяжелые публикации. Я не знаю ни одного строго категориального объяснения (ко) рекурсионных схем, отличных от этих четырех.

Ответ 3

Тим Уильямс вчера рассказал блестящую беседу в Лондонской группе пользователей Haskell о схемах рекурсии с мотивационным примером каждого из упоминаемых вами. Проверьте слайды:

http://www.timphilipwilliams.com/slides.html

В конце слайдов есть ссылки на всех обычных подозреваемых (линзы, бананы, колючая проволока ala carte и т.д.), и вы также можете использовать Google "Оригами-программирование", что является хорошим вступлением, которое я не встречал раньше.

и видео будет здесь, когда оно будет загружено:

http://www.youtube.com/user/LondonHaskell

edit Большинство ссылок, о которых идет речь, находятся в ответе huitseeker выше.