Якщо вам цікаво, ось кілька думок непрофесіонала щодо ролі монад та приєднань у мовах програмування:
Перш за все, існує для даної монади T
унікальне доповнення до категорії Клейслі T
. У Хаскелі використання монад в першу чергу обмежується операціями в цій категорії (яка, по суті, є категорією вільних алгебр, без коефіцієнтів). Насправді, все, що можна зробити з монадою Хаскелла, - це скласти деякі морфізми Клейслі типу a->T b
за допомогою виразів do (>>=)
тощо тощо, щоб створити новий морфізм. У цьому контексті роль монад обмежується лише економією позначень. Один використовує асоціативність морфізмів, щоб мати можливість писати (скажімо) [0,1,2]
замість (Cons 0 (Cons 1 (Cons 2 Nil)))
, тобто ви можете писати послідовність як послідовність, а не як дерево.
Навіть використання монад IO не є суттєвим, оскільки нинішня система типу Хаскелл є досить потужною для реалізації інкапсуляції даних (екзистенціальні типи).
Це моя відповідь на ваше початкове запитання, але мені цікаво, що говорять з цього приводу експерти Haskell.
З іншого боку, як ми вже зазначали, існує також відповідність 1-1 між монадами та приєднаннями до (T-) алгебр. З точки зору Маклейна, приєднання - це "спосіб виразити еквівалентність категорій". У типовій обстановці приєднань, <F,G>:X->A
де F
є якийсь `` генератор вільної алгебри '', а G `` забувливий функтор '', відповідна монада (за допомогою Т-алгебр) опише, як (і коли) A
будується алгебраїчна структура об'єкти X
.
У випадку з Hask і списком монади T, структура, яку T
вводить, - це структура моноїдів, і це може допомогти нам встановити властивості (включаючи правильність) коду за допомогою алгебраїчних методів, які забезпечує теорія моноїдів. Наприклад, функцію foldr (*) e::[a]->a
можна легко розглядати як асоціативну операцію, якщо <a,(*),e>
вона є моноїдом, що може бути використано компілятором для оптимізації обчислень (наприклад, паралелізмом). Інший додаток полягає у виявленні та класифікації "шаблонів рекурсії" у функціональному програмуванні за допомогою категоріальних методів з надією (частково) розпорядитися "переходом до функціонального програмування" Y (довільний комбінатор рекурсії).
Очевидно, подібного роду програми є однією з основних мотивацій творців теорії категорій (MacLane, Eilenberg та ін.), А саме встановити природну еквівалентність категорій та перенести добре відомий метод з однієї категорії в іншу (наприклад, гомологічні методи до топологічних просторів, алгебраїчні методи програмування тощо). Тут приєднання та монади є необхідними інструментами для використання цього зв'язку категорій. (До речі, поняття монад (і їх двоїстих комонад) настільки загальне, що можна навіть зайти так далеко, щоб визначити "когомології" типів Хаскелла. Але я ще не замислювався.)
Щодо недетермістичних функцій, про які ви згадали, я маю сказати набагато менше ... Але зауважте, що; якщо доповнення <F,G>:Hask->A
до якоїсь категорії A
визначає монаду списку T
, повинен бути унікальний "функтор порівняння" K:A->MonHask
(категорія моноїдів, що визначається в Хаскелі), див. CWM. Це фактично означає, що ваша категорія інтересів повинна бути категорією моноїдів у певній обмеженій формі (наприклад, у ній можуть бути відсутні коефіцієнти, але не вільні алгебри) для того, щоб визначити монаду списку.
Нарешті, кілька зауважень:
Двійковий функтор дерева, про який я згадав у своєму останньому розміщенні, легко узагальнює довільний тип даних
T a1 .. an = T1 T11 .. T1m | ...
. А саме, будь-який тип даних у Хаскелі, природно, визначає монаду (разом із відповідною категорією алгебр та категорією Клейслі), що є лише результатом того, що будь-який конструктор даних у Хаскеллі є загальним. Це ще одна причина, чому я вважаю, що клас Монади Хаскелла - це не набагато більше, ніж синтаксичний цукор (що, звичайно, досить важливо на практиці).