Я все еще изучаю функциональное программирование (с помощью f #), и недавно я начал читать о вычислительных выражениях. Я до сих пор не до конца понимаю эту концепцию, и одна вещь, которая не позволяет мне быть уверенным при чтении всех статей, касающихся монад (большинство из которых написаны на основе Haskell), - это связь между выражениями вычислений и монадами.
Написав все это, вот мой вопрос (на самом деле два вопроса):
Является ли каждое вычислительное выражение F # монадой? Можно ли выразить каждую монаду с помощью вычислительного выражения F #?
Я прочитал этот пост Томаса Петричека и, если я его хорошо понимаю, он утверждает, что выражения для вычислений - это больше, чем монады, но я не уверен, правильно ли я это интерпретирую.
functional-programming
Гжегож Славецки
источник
источник
Ответы:
Прежде всего, вычислительные выражения - это особенность языка, а монады - математические абстракции, поэтому с этой точки зрения это совершенно разные вещи .
Но это был бы не очень полезный ответ :-). Выражения вычислений - это языковая функция, которая дает вам синтаксис, который можно использовать для программирования с вычислениями (или типами данных), которые имеют монадическую структуру, но их также можно использовать с другими структурами. Вы можете прочитать мою статью о вычислениях F # zoo expression для получения более подробной информации, но выражения для вычислений можно использовать с:
MonadPlus
илиMonadOr
)Таким образом, вычислительные выражения, безусловно, тесно связаны с монадами, но они не так тесно связаны с ними. Это контрастирует, например, с
do
нотацией Хаскелла , которая гораздо более тесно связана с монадами (хотя даже это может быть использовано с вычислениями, которые не являются строго математически монадами).источник
Вы можете использовать вычислительные выражения для выражения монад. Существует пример здесь . Также, как вы заметили, вы можете использовать вычислительные выражения для гораздо большего, чем просто монады. Существует расширенное объяснение того, как они отличаются здесь . Здесь нет места, чтобы должным образом объяснить разницу, но выражения для вычислений отличаются от монад тем, что они повторно используют обычный синтаксис F # и имеют возможность добавлять дополнительные абстракции. Ограничение состоит в том, что его не-идиоматично (и трудно) написать вычислительное выражение, которое полиморфно по типу вычисления.
источник