Що таке Comonad і чим вони корисні?


16

Нещодавно я запилю мої знання про те, як працюють Монади. Я також був введений в поняття «комонадой» , яка описується як зворотний подвійний монади . Однак мені неможливо обмотати голову навколо цього.

Щоб зрозуміти Монади, я зробив власну аналогію для себе:

Монади можна розглядати як «креслення для створення конвеєрних стрічок виразів».

Щоб визначити нову монаду (новий вид конвеєрної системи), вам потрібно визначити:

  1. Спосіб поставити щось на конвеєр, наприклад, "запустити" стрічку. (Відомий як unitабо return)
  2. Спосіб підключення машини (вираз), яка буде частиною конвеєра до конвеєра. (Відомий як joinабо bindабо >>=).

(Є третя операція, яка бере діючу стрічку конвеєра, викидає її вміст і запускає нову конвеєрну стрічку, відому як >>, але вона використовується дуже рідко.)

Щоб машини та конвеєри працювали належним чином разом, вам потрібно переконатися, що:

  1. Якщо щось поставити на конвеєр і пропустити його через машину, вихід повинен бути таким же, як і при проходженні через машину вручну. (Ліва особа)
  2. Якщо ви хочете поставити конвеєрну стрічку між вже наявною конвеєрною стрічкою, ви не повинні закінчувати конвеєром, який має конвеєрну стрічку зверху, а скоріше одинарним довшим конвеєром. (Права особа)
  3. Це не має значення для виходу, якщо ви вручну використовуєте машину A, а потім передайте результат через підключений до транспортера BC або якщо ви використовуєте підключений до конвеєра AB, а потім передайте результат вручну через C. Іншими словами: ((a >> = b) >> = c) має бути таким же, як (a >> = (b >> = c)) (Асоціативність)

Найпростішим конвеєром був би той, який просто бере вхід і завжди продовжує наступне вираження. Ось що таке «трубопровід».

Інша можливість - це лише відпустити його через наступну машину, якщо для значення буде виконана якась умова. Це означає, що якщо в деяких між виразами між ними значення змінюється на щось, що більше не дозволено, то решта виразів буде пропущено. Це те, що монада 'Можливо' робить у Хаскеллі.

Ви також можете виконувати інші фантазійні умовні правила копіювання / зміни значень до або після передачі їх на машину. Приклад: Парсери (Тут, якщо вираз повертає результат "невдачі", значення, перш ніж вираз використовується як вихід).

Звичайно, аналогія не є досконалою, але я сподіваюся, що це добре уявляє, як працюють монади.

Однак у мене виникає багато проблем, щоб повернути цю аналогію на голову, щоб зрозуміти Комонади. Я знаю з невеликої кількості інформації, яку я знайшов в Інтернеті, що Комонад визначає:

  • extract, яка є своєрідною реверсом return, тобто приймає значення з Комонади.
  • duplicate, яка є свого роду зворотною join, тобто створює два Комонади з одного.

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

Що таке Комонада? Для чого вони корисні? Як їх можна використовувати? Вони їстівні?


2
"як Comonad може бути створений, якщо нам вдасться витягти з них або дублювати їх?" - Я відповім на ваше запитання запитанням: як можна вживати монаду, якщо ви лише можете підняти до них значення та послідовні обчислення?
Бенджамін Ходжсон

1
"Машина в кінці конвеєра" (вбік: я не вважаю аналогій, що корисно, коли говорити про монади) IOмонади - це система виконання Haskell, яка викликає main. Є unsafePerformIO, звичайно. Якщо ви хочете подумати про Maybeмонаду як про "машину в кінці конвеєра", ви можете використовувати maybe.
Бенджамін Ходжсон

1
Але, обернувши своє пояснення, коли ви хочете створити комонадне значення на початку ланцюжка cobindдодатків, повинна бути якась функція, яка робить щось корисне з внутрішнього представлення вашої комісії.
Бенджамін Ходжсон

2
конкретний екземпляр comonad або monad, очевидно, може мати більше функціональних можливостей, ніж потрібно просто для реалізації класів типу
jk

2
Не те, що це буде корисним, якщо ви не підходите до цього питання з категоріально-теоретичної / математичної сторони, але я хотів би зазначити, що комонада - це не зворотний, а скоріше дуал монади.
Йорг W Міттаг

Відповіді:


11

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

У теорії категорій є такі categories, які коротко розміщують сукупність objects(будь-якого типу чи характеру, внутрішня структура не має значення) та деякі arrowsміж цими об'єктами. Щоб щось було категорією, стрілки повинні відповідати деяким законам (ліва / права-ідентичність та асоціативність), але це не дуже важливо.

Тепер теорія категорій одночасно є дуже абстрактною / важкою і просторою. Щоб пройти все це потрібно багато часу (і я цього формально не вивчив, я знаю лише деякі основи), але існує поняття, яке називається а dual. В основному, для кожної категорії ви можете побудувати opposite category, зробивши те саме, але "перевернувши всі стрілки". Це дуже наївне визначення, але важко спробувати підсумувати. Дуал чогось у категорії C - це в основному те саме, що є в протилежній категорії C_op (болить голова ще?)

У будь-якому випадку, якщо у вас є монада над якоюсь категорією (і категорія, наприклад, може бути категорією, де об'єкти є типами в якійсь мові програмування, а стрілки є функціями між типами), комонада - це в основному те саме, тільки ви я перевернув усі стрілки (на кшталт того, як в такому випадку повернення підписів функції).

Більш детальний опис (хоч і не суперпер) є в цій дискусії між Еріком Мейджером та Брайаном Бекманом, де вони обговорюють поняття подвійності та те, як Ерік пішов про "перевертання стрілок" для IEnumerable<T>C #, коли створення реактивних рамок і IObservable<T>(що, наскільки я можу сказати, і я радий виправити, в основному це екземпляр списку комонад).

Іншим практичним прикладом комонів, згаданих у відео, є Task<T>тип .NET, де Task<U> ContinueWith<U>(Func<Task<T>, U>)було б подвійне bind(або SelectManyяк його називають у C #)


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