Разве Монада не является синтаксическим сахаром? - PullRequest
16 голосов
/ 30 августа 2011

Я прошел через различные газеты / статьи / блоги и что-то не про Монады.Люди говорят о них в различных контекстах, таких как теория категорий (что в мире такое?) И т. Д. Пройдя через все это и попытавшись по-настоящему понять и написать монадический код, я пришел к выводу, что монады - это просто синтаксический сахар (вероятно, самыйпрославил их всех).Будь то нотация в Хаскеле, или Вычислительные выражения в F #, или даже оператор выбора многих LINQ (помните, что синтаксис LINQ также является синтаксическим сахаром в C # / VB).

Мой вопрос: если кто-то считает монады болеезатем синтаксический сахар (через вложенные вызовы методов), затем, пожалуйста, просветите меня «практичностью», а не «теоретическими понятиями».

Спасибо всем.

ОБНОВЛЕНИЕ:

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

Ответы [ 6 ]

22 голосов
/ 30 августа 2011

Монада не является синтаксическим сахаром;У Haskell есть немного сахара для работы с монадами, но вы можете использовать их без сахара и операторов.Таким образом, Haskell на самом деле не «поддерживает» монады больше, чем множество других языков, просто облегчает их использование и реализацию.Монада - это не программная конструкция или языковая особенность как таковая;это абстрагированный способ мышления об определенных типах объектов, который, будучи интуитивно понятным как типы Haskell, обеспечивает хороший способ размышления о передаче состояния в типах, который позволяет Haskell (или даже любому языку, когда речь идет о функционально) делать свое дело,

14 голосов
/ 30 августа 2011

do нотация, вычислительные выражения и подобные языковые конструкции, конечно, являются синтаксическим сахаром.Это очевидно, поскольку эти конструкции обычно определяются в терминах того, к чему они относятся.Монада - это просто тип, который поддерживает определенные операции.В Haskell Monad - это класс типов, который определяет эти операции.

Итак, чтобы ответить на ваш вопрос: Monad - это не синтаксический сахар, это класс типов, однако запись do является синтаксическим сахаром (иконечно, совершенно необязательно - вы можете использовать монады без штрафа do).

12 голосов
/ 30 августа 2011

По определению, монады не являются синтаксическим сахаром.Они представляют собой тройку операций (возврат / единица измерения, сопоставление и объединение) над совокупностью значений (списки, наборы, типы параметров, функции с состоянием, продолжения и т. Д.), Которые подчиняются небольшому числу законов.Как используется в программировании, эти операции выражаются в виде функций.В некоторых случаях, таких как Haskell, эти функции могут быть выражены полиморфно во всех монадах с помощью классов типов.В других случаях эти функции должны иметь разные имена или пространства имен для каждой монады.В некоторых случаях, например в Haskell, существует слой синтаксического сахара, который делает программирование с этими функциями более прозрачным.

Таким образом, монады не относятся к вызовам вложенных функций как таковых и, конечно, не касаются сахарадля них.Они касаются самих трех функций, типов значений, над которыми они работают, и законов, которым подчиняются эти функции.

5 голосов
/ 30 августа 2011

Монады являются синтаксическим сахаром в том же смысле, что классы и синтаксис вызова методов являются синтаксическим сахаром. Полезно и практично, если немного многословно, применять объектно-ориентированные принципы к языку, такому как C. Подобно ОО (и многим другим языковым функциям), монады - это идея, способ думать об организации ваших программ.

Монадический код может позволить вам написать форму кода, откладывая некоторые решения на потом. Монаду Log, которая может быть вариантом Writer, можно использовать для написания кода для библиотеки, которая поддерживает ведение журнала, но позволяет приложению-потребителю решать, куда вести запись, если и где угодно. Вы можете сделать это вообще без синтаксического сахара или использовать его, если язык, на котором вы работаете, поддерживает это.

Конечно, есть и другие способы получить эту функцию, но это только один, надеюсь, "практический" пример.

1 голос
/ 30 августа 2011

Сначала я бы назвал это шаблоном в том смысле, что ma -> (a -> mb) -> mb (с разумным поведением) удобен для множества различных задач / конструкторов типов.

На самом деленастолько удобный, что он заслуживает предоставления некоторого синтаксического сахара в языке.Это нотация do в Haskell, from в C #, for понимания в scala.При реализации синтетического сахара требуется только соблюдение шаблона именования (selectMany в C #, flatMap в scala).Эти языки делают это без Монады, являющейся типом в их библиотеках (в scala можно написать один).Обратите внимание, что C # делает это и для шаблона Iterator.В то время как есть интерфейс IEnumerable, foreach переводится в вызовы к GetEnumerator / MoveNext / Current на основании имени методов, независимо от типов.Только когда перевод выполнен, он проверяет, что все определено и правильно напечатано.

Но в Haskell (это может быть сделано также в Scala или OCaml, не в C #, и я считаю, что это невозможно и в F #).), Monad - это больше, чем шаблон дизайна + синтетический сахар на основе шаблона именования.Это фактический API, программный компонент, что угодно.

Рассмотрим шаблон итератора в (статически типизированных) императивных языках.Вы можете просто реализовать MoveNext / Current (или hasNext / next) в классах, где это уместно.И если для этого есть какой-то синтаксический сахар, такой как C #, это уже весьма полезно.Но если вы сделаете это интерфейсом, вы сразу сможете сделать гораздо больше.Вы можете иметь вычисления, которые работают на любом итераторе.У вас могут быть служебные методы на итераторе (find, filter, chain, nest ..), делающие их более мощными.

Когда Monad является типом, а не просто шаблоном, вы можете сделать то же самое.У вас могут быть служебные функции, которые делают работу с Monad более мощной (в Control.Monad ) вы можете выполнять вычисления, где тип используемой монады является параметром (см. Эту старую статью изВадлер, показывающий, как интерпретировать интерпретатор по типу монады и что делают различные экземпляры).Чтобы иметь тип монады (класс типов), вам нужен какой-то тип более высокого порядка, то есть вы должны иметь возможность параметризации с помощью конструктора типов, а не простого типа данных.

1 голос
/ 30 августа 2011

Нет,

Вы можете думать о Монаде (или о любых других типах классов в Haskell) больше с точки зрения паттерна. Вы видите шаблон и обрабатываете его каждый раз одинаково, так что вы можете обобщить его.

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

Синтаксический сахар - это просто хороший способ составить связки;) Это продолжение вещи;)

Для практических понятий: просто посмотрите на асинхронные рабочие процессы или монаду ввода-вывода - должно быть достаточно практичным;)

...