it-swarm.dev

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

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

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

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

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

81
Robin Green

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

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

Правка: немного больше

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

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

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

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

42
sclv

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

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

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

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

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

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

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

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

23
huitseeker

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

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

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

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

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

edit Большинство ссылок в ответе выше.

16
Ben Ford