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


83

Я шукаю по-справжньому простих, простих для сприйняття пояснень схем рекурсії та схем основних курсів (катаморфізми, анаморфізми, гіломорфізми тощо), які не потребують переходу безлічі посилань або відкриття підручника з теорії категорій. Я впевнений, що багато з цих схем винайшов несвідомо і "застосував" їх у своїй голові під час процесу кодування (я впевнений, що багато хто з нас це робить), але я не маю уявлення, які схеми (спільної) рекурсії я використання називаються. (Добре, я збрехав. Я щойно читав про декілька з них, що викликало це питання. Але до сьогоднішнього дня я не мав поняття.)

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

Йому також, напевно, заважають їх імена. Я думаю, що існують деякі альтернативні, менш математичні назви (щось про банани та колючий дріт?), Але я навіть не здогадуюсь, що це за назви, що скорочуються, для схем рекурсії, які я використовую.

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


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

Відповіді:


44

Надзвичайно вільно кажучи, катаморфізм - це лише невелике узагальнення fold, а анаморфізм - це невелике узагальненняunfold. (А гіломорфізм - це просто розгортання, за яким слідує складка.). Зазвичай їх подають у більш суворій формі, щоб зробити зв’язок з теорією категорій яснішим. Більш щільна форма дозволяє розрізнити дані (обов’язково скінченний добуток початкової алгебри) та коди (можливо, нескінченний добуток кінцевої коагебри). Ця відмінність дозволяє нам гарантувати, що складка ніколи не потрапляє в нескінченний список. Інша причина смішного способу написання катаморфізмів та анаморфізмів полягає в тому, що, оперуючи F-алгебрами та F-коалгебрами (генерованими з функторів), ми можемо писати їх раз і назавжди, а не один раз у списку, один раз над бінарне дерево тощо. Це, у свою чергу, допомагає чітко зрозуміти, чому вони всі однакові.

Але з чистої точки зору інтуїції, ви можете думати про ката та ана як про зменшення та виробництво, і все про це.

Редагувати: трохи більше

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

Екметт опублікував приємний "посібник" з різних схем у літературі: http://comonad.com/reader/2009/recursion-schemes/

Однак, хоча «інтуїтивні» пояснення є простими, зв’язаний код є меншим, і публікації в блогах на деяких з них можуть бути дещо складними / заборонними.

Тим не менш, за винятком, можливо, істоморфізмів, я не думаю, що решта зоопарку - це те, про що ви хотіли б думати безпосередньо більшу частину часу. Якщо ви "отримаєте" гіло та мета, ви можете висловити майже все що завгодно лише ними. Зазвичай інші морфізми є більш обмежувальними, не меншими (але, отже, надають вам більше властивостей "безкоштовно").


1
Добре, дякую, але це лише ті три - є й інші. Я сподіваюся, що хтось додасть відповідь, яка стосується деяких інших схем рекурсії.
Робін Грін,

3
Більшість рекурсивних схем, що залишились, є неясними, за винятком, можливо, параморфізмів, які досить добре відповідають "принципам індукції" для типів, які ми часто бачимо в залежних мовах. Я ще не зовсім зрозумів, як тут працює вся теорія категорій, але я сумніваюся, що це зламається занадто жахливо :)
copumpkin

3
Параморфізм схожий на складку, але ви можете заглянути в "решту введених даних". Складка дає вам лише елементарний доступ під час обходу.
Стівен Тетлі

23

Кілька посилань, від найбільш теоретичної категорії (але доречної для надання "карти територій", яка дозволить вам уникнути "натискання безлічі посилань"), до більш простих і самостійних:

  • Що стосується словникового запасу "банани та колючий дріт", це походить від оригінальної статті Meijer, Fokkinga & Patterson (та її продовження іншими авторами), і в сумі вона настільки ж важка, як і менш симпатичні альтернативи: "імена" (банани тощо) - це лише ярлик для графічного вигляду ascii позначень конструкцій, до яких вони прив'язані. Наприклад, катаморфізми (тобто складки) представлені (| _ |), а паралельна з дужкою виглядає як "банан", звідси і назва. Цю газету найчастіше називають "непроникною", отже, не перше, що я б шукав на вашому місці.

  • Основним посиланням на ці схеми рекурсії (або, точніше, на реляційний підхід до цих схем рекурсії) є Алгебра програмування Берда і де Мура (книга недоступна, крім випадків друку на замовлення, але є копії, доступні вживані & це повинно бути в бібліотеках). Він містить більш темне та детальне пояснення безточкового програмування, якщо воно все ще є «академічним»: книга вводить деяку теоретичну категорію словникового запасу, хоча і самостійно. Проте вправи (яких ви не знайдете в роботі) допомагають.

  • Сортуючи морфізми Лекса Августджайна , використовує алгоритми сортування на різних структурах даних для пояснення схем рекурсії. Це майже " схеми рекурсії для манекенів " за побудовою:

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

  • Інший підхід до створення більш символи вільних уявлень є Джеремі Гіббонс глава Origami Програмування в потісі програмування , з деяким перекриттям з попереднім. Її бібліографія дає ознайомлення з ознайомленнями з темою.

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

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


16

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

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

У кінці слайдів є посилання на всіх звичних підозрюваних (лінзи, банани, колючий дріт на замовлення тощо), і ви також можете погуглити "Програмування орігамі", що є гарним вступом, якого я раніше не зустрічав.

і відео буде тут, коли його буде завантажено:

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

редагувати Більшість посилань, про які йдеться, містяться у відповіді huitseeker вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.