Нещодавно я запилю мої знання про те, як працюють Монади. Я також був введений в поняття «комонадой» , яка описується як зворотний подвійний монади . Однак мені неможливо обмотати голову навколо цього.
Щоб зрозуміти Монади, я зробив власну аналогію для себе:
Монади можна розглядати як «креслення для створення конвеєрних стрічок виразів».
Щоб визначити нову монаду (новий вид конвеєрної системи), вам потрібно визначити:
- Спосіб поставити щось на конвеєр, наприклад, "запустити" стрічку. (Відомий як
unit
абоreturn
)- Спосіб підключення машини (вираз), яка буде частиною конвеєра до конвеєра. (Відомий як
join
абоbind
або>>=
).(Є третя операція, яка бере діючу стрічку конвеєра, викидає її вміст і запускає нову конвеєрну стрічку, відому як
>>
, але вона використовується дуже рідко.)Щоб машини та конвеєри працювали належним чином разом, вам потрібно переконатися, що:
- Якщо щось поставити на конвеєр і пропустити його через машину, вихід повинен бути таким же, як і при проходженні через машину вручну. (Ліва особа)
- Якщо ви хочете поставити конвеєрну стрічку між вже наявною конвеєрною стрічкою, ви не повинні закінчувати конвеєром, який має конвеєрну стрічку зверху, а скоріше одинарним довшим конвеєром. (Права особа)
- Це не має значення для виходу, якщо ви вручну використовуєте машину A, а потім передайте результат через підключений до транспортера BC або якщо ви використовуєте підключений до конвеєра AB, а потім передайте результат вручну через C. Іншими словами: ((a >> = b) >> = c) має бути таким же, як (a >> = (b >> = c)) (Асоціативність)
Найпростішим конвеєром був би той, який просто бере вхід і завжди продовжує наступне вираження. Ось що таке «трубопровід».
Інша можливість - це лише відпустити його через наступну машину, якщо для значення буде виконана якась умова. Це означає, що якщо в деяких між виразами між ними значення змінюється на щось, що більше не дозволено, то решта виразів буде пропущено. Це те, що монада 'Можливо' робить у Хаскеллі.
Ви також можете виконувати інші фантазійні умовні правила копіювання / зміни значень до або після передачі їх на машину. Приклад: Парсери (Тут, якщо вираз повертає результат "невдачі", значення, перш ніж вираз використовується як вихід).
Звичайно, аналогія не є досконалою, але я сподіваюся, що це добре уявляє, як працюють монади.
Однак у мене виникає багато проблем, щоб повернути цю аналогію на голову, щоб зрозуміти Комонади. Я знаю з невеликої кількості інформації, яку я знайшов в Інтернеті, що Комонад визначає:
extract
, яка є своєрідною реверсомreturn
, тобто приймає значення з Комонади.duplicate
, яка є свого роду зворотноюjoin
, тобто створює два Комонади з одного.
Але як Comonad можна створити миттєво, якщо нам вдасться витягнути з них або дублювати їх? І як їх насправді можна використовувати? Я бачив цей надзвичайно дивовижний проект та розмови про нього (який я, на жаль, дуже мало розумів), але я не впевнений, яку саме частину функціоналу надає Comonad.
Що таке Комонада? Для чого вони корисні? Як їх можна використовувати? Вони їстівні?
IO
монади - це система виконання Haskell, яка викликає main
. Є unsafePerformIO
, звичайно. Якщо ви хочете подумати про Maybe
монаду як про "машину в кінці конвеєра", ви можете використовувати maybe
.
cobind
додатків, повинна бути якась функція, яка робить щось корисне з внутрішнього представлення вашої комісії.