Выражение вычислений такое же, как монада?

22

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

Написав все это, вот мой вопрос (на самом деле два вопроса):

Является ли каждое вычислительное выражение F # монадой? Можно ли выразить каждую монаду с помощью вычислительного выражения F #?

Я прочитал этот пост Томаса Петричека и, если я его хорошо понимаю, он утверждает, что выражения для вычислений - это больше, чем монады, но я не уверен, правильно ли я это интерпретирую.

Гжегож Славецки
источник
@ Рафаэль, могу я спросить, в чем причина удаления тега lang?
Гжегож Славецкий
2
Поскольку мы заботимся о концепциях, мы стараемся придерживаться большинства языковых особенностей. Я не знаю, что удаление F # делает с вопросом ( я думаю, что если важно, чтобы это был F #, тогда вопрос здесь не по теме, но это пограничный случай), поэтому я удаляю только тег F #. Основное правило: F # не является концепцией CS, поэтому для него не требуется тег. (Да, мне известны другие теги PL, и они мне тоже не нравятся. По некоторым вопросам сообщество решило, что они требуют эти теги.)
Рафаэль
1
@ Рафаэль Я считаю, что вопрос действительно пограничный. Кто-то решил перенести это сюда, но, похоже, это тоже немного не по теме. С тех пор сам вопрос является своего рода компьютерным, но в то же время и ответы, и вопрос конкретно связаны с f #. Я понимаю Ваше эмпирическое правило, спасибо за разъяснения.
Гжегож Славецкий

Ответы:

22

Прежде всего, вычислительные выражения - это особенность языка, а монады - математические абстракции, поэтому с этой точки зрения это совершенно разные вещи .

Но это был бы не очень полезный ответ :-). Выражения вычислений - это языковая функция, которая дает вам синтаксис, который можно использовать для программирования с вычислениями (или типами данных), которые имеют монадическую структуру, но их также можно использовать с другими структурами. Вы можете прочитать мою статью о вычислениях F # zoo expression для получения более подробной информации, но выражения для вычислений можно использовать с:

  • Монады, но также и аддитивные монады (что называют Хаскеллерс MonadPlusили MonadOr)
  • Составные вычисления (что Хаскеллерс называет монадными трансформаторами)
  • Вычисления, которые являются монадическими, но поддерживают другие конструкции F #, такие как обработка исключений
  • Моноиды (и несколько вариантов без монадической привязки)
  • Аппликативные функторы (хотя это реализовано только в расширении исследования)

Таким образом, вычислительные выражения, безусловно, тесно связаны с монадами, но они не так тесно связаны с ними. Это контрастирует, например, с doнотацией Хаскелла , которая гораздо более тесно связана с монадами (хотя даже это может быть использовано с вычислениями, которые не являются строго математически монадами).

Томас Петричек
источник
3
Преобразователи монад - это общий способ преобразования одной монады в другую - выражения вычисления F # действительно поддерживают только непосредственную реализацию / результата / этого преобразования, а не само преобразование.
GS - извиниться перед Моникой
1
@GaneshSittampalam - Да, вы правы. Моя попытка упростить здесь была не так уж полезна :-). Выражения вычислений могут дать вам синтаксис для работы с вычислениями, которые являются результатом применения преобразователя монад (с потенциально разным синтаксисом для базовой монады и для
составной
5

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

N_A
источник
1
Пожалуйста, сделайте свой ответ более самостоятельным, по крайней мере, суммируя материал на страницах, на которые вы ссылаетесь. Ваш текущий ответ будет совершенно бессмысленным, если две ссылки перестанут работать.
Дэвид Ричерби
2
Я не уверен, о чем ты говоришь. Я четко ответил на вопросы, а затем дал ссылки на дополнительную информацию, если интересующийся вопрос заинтересован. Ссылки не нужны для ответа на вопрос.
N_A
1
Я даже не могу себе представить, что две ссылки могут перестать работать :-)
Томас Петричек