Я ищу действительно простые и понятные объяснения схем рекурсии и схем коркурсии (катаморфизмы, анаморфизмы, гиломорфизмы и т. Д.), Которые не требуют перехода по множеству ссылок или открытия учебника теории категорий. Я уверен, что неосознанно заново изобрел многие из этих схем и «применил» их в своей голове в процессе кодирования (уверен, что многие из нас это уже сделали), но я понятия не имею, какие схемы (со) рекурсии я использование называются. (Хорошо, я солгал. Я только что прочитал о некоторых из них, что вызвало этот вопрос. Но до сегодняшнего дня я понятия не имел.)
Я думаю, что распространению этих концепций в сообществе программистов препятствуют запрещающие объяснения и примеры, которые часто встречаются - например, в Википедии, но также и в других местах.
Возможно, этому помешали и их имена. Я думаю, что есть некоторые альтернативные, менее математические имена (что-то о бананах и колючей проволоке?), Но я также не знаю, какие более короткие имена для схем рекурсии, которые я использую.
Я думаю, что было бы лучше использовать примеры с типами данных, представляющими простые реальные проблемы, а не с абстрактными типами данных, такими как двоичные деревья.
Ответы:
Вообще говоря, катаморфизм - это лишь небольшое обобщение
fold
, а анаморфизм - это небольшое обобщениеunfold
. (А гиломорфизм - это просто развёртка, за которой следует свёртка.) Обычно они представлены в более строгой форме, чтобы сделать связь с теорией категорий более ясной. Более плотная форма позволяет нам различать данные (обязательно конечное произведение исходной алгебры) и коданные (возможно бесконечное произведение конечной коалгебры). Это различие позволяет нам гарантировать, что свертка никогда не вызывается в бесконечном списке. Другая причина забавного способа, которым обычно записываются катаморфизмы и анаморфизмы, заключается в том, что, оперируя F-алгебрами и F-коалгебрами (сгенерированными из функторов), мы можем записать их раз и навсегда, а не один раз по списку, один раз за двоичное дерево и т. д. Это, в свою очередь, помогает понять, почему все они - одно и то же.Но с точки зрения чистой интуиции вы можете думать о ката и ана как о сокращении и производстве, и это все.
Изменить: немного больше
Метаморфизм (Гиббонс) подобен вывернутому наизнанку гило - это складка, за которой следует разворачивание. Таким образом, вы можете использовать его, чтобы разрушить поток и создать новый с потенциально другой структурой.
Экметт опубликовал хороший «полевой справочник» по различным схемам в литературе: http://comonad.com/reader/2009/recursion-schemes/
Однако, хотя «интуитивно понятные» объяснения просты, связанный код не так прост, и сообщения в блогах о некоторых из них могут быть немного сложными / запрещающими.
Тем не менее, за исключением, возможно, гистоморфизмов, я не думаю, что остальная часть зоопарка - это обязательно то, о чем вы хотели бы думать напрямую большую часть времени. Если вы «получите» hylo и meta, вы сможете выразить почти все что угодно только с их помощью. Обычно другие морфизмы более строгие, а не менее (но, следовательно, дают вам больше свойств «бесплатно»).
источник
Несколько ссылок, от наиболее теоретико-категориальных (но имеющих отношение к созданию «карты территории», которая позволит вам избежать «нажатия на множество ссылок») до более простых и автономных:
Что касается словаря «бананы и колючая проволока», то это взято из оригинальной статьи Мейера, Фоккинга и Паттерсона (и ее продолжения, написанных другими авторами), и в целом он так же сложен в обозначениях, как и менее симпатичные альтернативы: «имена» (бананы и т. д.) - это просто ярлык для графического представления обозначений ascii конструкций, к которым они привязаны. Например, катаморфизмы (то есть складки) представлены значком
(| _ |)
, а скобка со скобками выглядит как «банан», отсюда и название. Это бумага, которую чаще всего называют «непроницаемой», поэтому я бы не стал первым делом искать на вашем месте.Основным справочником для этих схем рекурсии (или, точнее, для реляционного подхода к этим схемам рекурсии) является Алгебра программирования Берда и де Моора (книга недоступна, кроме как для печати по запросу, но есть копии, доступные из вторых рук. & это должно быть в библиотеках). Он содержит более динамичное и подробное объяснение безточечного программирования, хотя и «академическое»: книга вводит некоторый теоретико-категориальный словарь, хотя и самодостаточно. Тем не менее, упражнения (которые вы не найдете в статье) помогают.
Сортировка морфизмов Лекса Огюстджейна использует алгоритмы сортировки по различным структурам данных для объяснения схем рекурсии. По конструкции это в значительной степени " схемы рекурсии для чайников ":
Другой подход к созданию более символы свободных представлений является Джереми Гиббонс глава Origami Программирования в потехе программирования , с некоторым перекрытием с предыдущим. Библиография знакомит с введением в тему.
Изменить: Джереми Гиббонс просто сообщил мне, что он добавил ссылку на библиографию всей книги на веб-странице книги после прочтения этого вопроса. Наслаждайтесь !
Боюсь, что эти последние две ссылки дают только твердое объяснение морфизмов (cata | ana | hylo | para), но я надеюсь, что этого будет достаточно, чтобы разорвать алгебраический формализм, который вы можете найти в публикациях с большим количеством нотаций. Я не знаю какого-либо строго не теоретико-категориального объяснения схем (ко) рекурсии, кроме этих четырех.
источник
Тим Уильямс вчера вечером в лондонской группе пользователей Haskell выступил с блестящей речью о схемах рекурсии с мотивирующим примером каждой из упомянутых вами. Посмотрите слайды:
http://www.timphilipwilliams.com/slides.html
В конце слайдов есть ссылки на всех обычных подозреваемых (линзы, бананы, колючая проволока и т. Д.), А также вы можете погуглить «Программирование оригами», это хорошее вступление, с которым я раньше не сталкивался.
и видео будет здесь, когда оно будет загружено:
http://www.youtube.com/user/LondonHaskell
edit Большинство рассматриваемых ссылок находятся в ответе huitseeker выше.
источник