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

83

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

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

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

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

Робин Грин
источник
6
У Джереми Гиббонса есть несколько статей, которые могут быть лучшим введением, поскольку они ясны и в значительной степени автономны. «Потоковое изменение представления» (сложение и развертывание вместе), «Разделение для понимания программы» (параморфизмы и др.), «Недооцененное развертывание» (анаморфизмы). cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html
Стивен Тетли 05

Ответы:

44

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

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

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

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

Экметт опубликовал хороший «полевой справочник» по различным схемам в литературе: http://comonad.com/reader/2009/recursion-schemes/

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

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

sclv
источник
1
Хорошо, спасибо, но это только эти три - есть и другие. Я надеюсь, что кто-нибудь добавит ответ о других схемах рекурсии.
Робин Грин
3
Большинство оставшихся схем рекурсии довольно неясны, за исключением, возможно, параморфизмов, которые довольно хорошо соответствуют «принципам индукции» для типов, которые мы часто видим в зависимых языках. Я не совсем понял, как здесь работает вся теория категорий, но сомневаюсь, что это сломается слишком ужасно :)
copumpkin
3
Параморфизм похож на складку, но вы можете взглянуть на «остальную часть ввода». Сгиб дает только элементарный доступ во время обхода.
Стивен Тетли
23

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

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

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

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

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

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

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

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

Франсуа Г.
источник
16

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

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

В конце слайдов есть ссылки на всех обычных подозреваемых (линзы, бананы, колючая проволока и т. Д.), А также вы можете погуглить «Программирование оригами», это хорошее вступление, с которым я раньше не сталкивался.

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

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

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

Бен Форд
источник