Схемы рекурсии для чайников? - PullRequest
81 голосов
/ 04 августа 2011

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

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

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

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

Ответы [ 3 ]

42 голосов
/ 04 августа 2011

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

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

Редактировать: немного больше

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

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

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

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

23 голосов
/ 06 августа 2011

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

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

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

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

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

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

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

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

16 голосов
/ 28 марта 2013

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...