Чи виразок обчислень такий самий, як монада?


22

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

Написавши все це, ось моє запитання (насправді два запитання):

Чи кожен вираз обчислень F # є монадою? Чи можна кожну монаду виразити виразом обчислення F #?

Я прочитав цю публікацію Томаша Петрикека, і якщо я це добре розумію, він стверджує, що вираження обчислень більше, ніж монади, але я не впевнений, чи правильно інтерпретую це.


@Raphael чи можу я запитати, в чому причина видалення тегу lang?
Grzegorz Sławecki

2
Оскільки ми піклуємося про поняття, ми намагаємось зберегти тут більшість речей мови-агностики. Я не знаю, що видаляє F # до питання ( я думаю, якщо важливо, що це F #, то тут питання офтопік, але це прикордонний випадок), тому я видаляю лише тег F #. Правило: F # - це не поняття CS, тому він не потребує тегу. (Так, мені відомо про інші теги PL, і вони мені теж не подобаються. Для деяких питань громада вирішила, що вони гарантують ці теги.)
Рафаель

1
@Raphael Я вважаю, що це справді прикордонний випадок. Хтось вирішив перенести це сюди, але, здається, це теж трохи не тема. Питання саме по собі є комп’ютером, але в той же час і відповіді, і питання спеціально пов'язані з f #. Я розумію ваше правило, дякую за роз'яснення.
Grzegorz Sławecki

Відповіді:


22

Перш за все, обчислювальні вирази - це мовна особливість, тоді як монади - це математичні абстракції, тому з цієї точки зору вони є абсолютно різними речами .

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

  • Монади, але також монади, що додають (як називають Haskellers MonadPlusабо MonadOr)
  • Складені обчислення (те, що Haskellers називають монадами-трансформаторами)
  • Обчислення, які є монадичними, але підтримують інші конструкції F #, такі як обробка виключень
  • Моноїди (і пара варіацій без монадичного зв’язування)
  • Прикладні функтори (хоча це реалізовано лише в розширенні дослідження)

Так, обчислювальні вирази, безумовно, тісно пов'язані з монадами, але вони не пов'язані з ними так тісно. Це на відміну, наприклад, із doпозначенням Хаскелла , яке набагато тісніше пов'язане з монадами (хоча навіть це можна використовувати для обчислень, які не є строго математично монадами).


3
Трансформатори Монади є загальним способом перетворення однієї монади в іншу монаду - вирази обчислень F # дійсно підтримують безпосередньо реалізацію / результат / цієї трансформації, а не саме перетворення.
GS - Вибачте Моніку

1
@GaneshSittampalam - Так, ви праві. Моя спроба спростити тут не все було корисно :-). Вираження обчислень можуть дати вам синтаксис для роботи з обчисленнями, який є результатом застосування трансформатора монади (з потенційно різним синтаксисом для основної монади та для складеної монади)
Томаш Петричек,

5

Ви можете використовувати обчислювальні вирази для вираження монад. Існує приклад тут . Також, як ви зазначали, обчислювальні вирази можна використовувати набагато більше, ніж просто монади. Існує розширене пояснення про те, чим вони відрізняються тут . Тут немає місця, щоб правильно пояснити різницю, але вирази обчислень відрізняються від монад тим, що вони використовують повторно звичайний синтаксис F # і мають можливість додавати додаткові абстракції. Обмеження полягає в тому, що його неідіоматичне (і складне) записувати обчислювальний вираз, який є поліморфним щодо типу обчислень.


1
Будь ласка, зробіть свою відповідь більш самодостатньою, принаймні узагальнюючи матеріал на сторінках, на які ви посилаєтесь. Ваша поточна відповідь буде абсолютно безглуздою, якщо два ланки перестануть працювати.
Девід Річербі

2
Я не впевнений, про що ти говориш. Я чітко відповів на питання, а потім дав посилання на додаткову інформацію, якщо запитувач зацікавлений. Посилання не потрібні для відповіді на питання.
N_A

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