Идея монад как моделей вычислений восходит к работе Эудженио Могги. Среди практиков Хаскелла самая известная статья Moggi по этому вопросу - Понятия вычислений как монад (1991). Соответствующие цитаты включают в себя:
[лямбда] -калькул считается полезным математическим инструментом при изучении языков программирования, поскольку программы могут быть идентифицированы с помощью [лямбда] -термов. Однако, если кто-то идет дальше и использует [beta] [eta] -конверсию для доказательства эквивалентности программ, то вводится грубое упрощение (программы отождествляются с полными функциями от значений до значений ), которые могут поставить под угрозу применимость теоретических результатов. В этой статье мы вводим исчисления, основанные на категориальной семантике для вычислений , которые обеспечивают правильную основу для доказательства эквивалентности программ для широкого диапазона понятий вычисления . [п. 1]
[...]
Мы не берем в качестве отправной точки для доказательства эквивалентности программ теорию [бета] [эта] -конверсии, которая идентифицирует обозначение программы (процедуры) типа A -> B с полной функцией из A до B, так как эта идентификация полностью уничтожает поведение, такое как недопущение, недетерминизм и побочные эффекты, которые могут проявляться в реальных программах. Вместо этого мы действуем следующим образом:
- Мы берем теорию категорий как общую теорию функций и развиваем категориальную семантику вычислений на основе монад. [...] [п. 1]
[...]
Основная идея, лежащая в основе категориальной семантики ниже, заключается в том, что для интерпретации языка программирования в категории [C] мы различаем объект A значений (типа A) от объекта TA вычислений (типа A). ) и принять в качестве обозначений программ (типа А) элементы ТА. В частности, мы отождествляем тип A с объектом значений (типа A) и получаем объект вычислений (типа A), применяя унарный конструктор типа T к A. Мы называем T a понятием вычисления , поскольку он абстрагируется от типа значений, которые могут быть получены вычислениями. Существует много вариантов ТА, соответствующих различным понятиям вычислений. [Стр. 2-3]
[...]
Мы определили монады как важные для моделирования представлений о вычислениях, но вычислительные монады , похоже, обладают дополнительными свойствами; например, они имеют тензорную прочность и могут удовлетворять моно-требованиям. Вполне вероятно, что существуют другие свойства вычислительных монад, которые еще предстоит идентифицировать, и нет никаких оснований полагать, что такие свойства должны быть найдены в литературе по монадам. [п. 27 - спасибо Данидиаз]
В более ранней статье Moggi, Вычислительное лямбда-исчисление и монады (1989 - спасибо Михиду за ссылку), буквально говорится о "вычислительной модели [с]":
A вычислительная модель является монадой (T; [eta]; [mu]), удовлетворяющей требованию mono : [eta-A] является моно для каждого A [принадлежащего до] С.
Существует альтернативное описание монады (см. [7]), которое легче обосновать в вычислительном отношении. [...] [п. 2]
Этот конкретный бит терминологии был опущен в Понятиях вычислений как монад , поскольку Могги сосредоточил внимание на своей презентации на «альтернативном описании» (а именно на троек Клейсли, которые составлены, в Язык Хаскеля, конструктор типов, return и bind). Однако суть остается неизменной.
Филипп Вадлер представляет идею с более практичным уклоном в Монады для функционального программирования (1992):
Описано использование монад для структурирования функциональных программ.Монады предоставляют удобную структуру для моделирования эффектов, найденных в других языках, таких как глобальное состояние, обработка исключений, вывод или недетерминизм.[п.1]
[...]
Чистые функциональные языки имеют это преимущество: весь поток данных делается явным. И этот недостаток: иногда это болезненно явно.
Программа на чистом функциональном языке записывается в виде системы уравнений.Явный поток данных гарантирует, что значение выражения зависит только от его свободных переменных.Следовательно, замена равных на равные всегда действительна, поэтому такие программы особенно легко рассуждать.Явный поток данных также гарантирует, что порядок вычислений не имеет значения, что делает такие программы восприимчивыми к ленивым вычислениям.
Именно в отношении модульности явный поток данных становится и благословением, и проклятием.С одной стороны, это максимальная модульность.Все входящие и исходящие данные отображаются и доступны, обеспечивая максимальную гибкость.С другой стороны, это надир модульности.Суть алгоритма может быть захоронена под каналом, необходимым для переноса данных с момента создания до точки использования.[п.2]
[...]
Скажите, что желательно добавить проверку ошибок, чтобы во втором примере, приведенном выше, возвращалось заметное сообщение об ошибке.На нечистом языке это легко достигается с помощью исключений.
На чистом языке обработка исключений может быть имитирована введением типа для представления вычислений, которые могут вызывать исключение.[Стр.3 -4 - обратите внимание, что это до того, как монады представлены как объединяющая абстракция.]
[...]
Каждая из вариаций интерпретатора имеет похожую структуру, которая может бытьабстрактно, чтобы дать понятие монады.
В каждом варианте мы вводили тип вычислений.Соответственно, M представляет вычисления, которые могут вызывать исключения, воздействовать на состояние и генерировать выходные данные.К настоящему времени читатель догадывается, что М обозначает монаду.[п.6]
Это один из корней использования «вычисления» для обращения к монадическим значениям.
Значительная часть более поздней литературы использует концепцию вычислений таким образом.Например, это вступительный отрывок из «1099 * Понятия вычислений как моноидов» Экскиеля Риваса и Мауро Яскелиоффа (2014 - спасибо Данидиазу за предложение):
При построении семантической модели системы или при структурировании компьютерного кода существует несколько понятий вычисления, которые можно рассмотреть.Монады (Moggi, 1989; Moggi, 1991) являются наиболее популярным понятием, но другие понятия, такие как стрелки (Hughes, 2000) и, совсем недавно, аппликативные функторы (McBride & Paterson, 2008) получили всеобщее признание.Каждое из этих понятий вычислений имеет особые характеристики, которые делают их более подходящими для некоторых задач, чем для других.Тем не менее, можно объединить все три различных понятия в рамках единой концептуальной основы.[п.1]
Другим хорошим примером является Комонадные представления о вычислениях Тармо Уусталу и Вармо Вене (2000):
После первоначальной работы Могги в конце 80-х годов монады, точнее, сильные монады, стали общепринятым инструментом для структурирования эффективных понятий вычислений, таких как вычисления с исключениями, выходные данные, вычисления с использованием среды, преобразование состояний, недетерминированныевероятностные вычисления и т. д. Идея состоит в том, чтобы использовать категорию Клейсли в качестве категории нечистых, эффективных функций, причем включение Клейсли дает вложение чистых функций из базовой категории.[...] [п.263]
[...]
Отправной точкой в монадическом подходе к (эффективному вычислению) является идея о том, что нечистые, эффективные функции от A до B должны быть не чем иным, как чистымифункции от А до ТБ.Здесь чистые функции живут в базовой категории C, а T является эндофунктором на C, который описывает понятие эффекта интереса;Полезно думать о TA как о типе эффективных вычислений значений данного типа A.
Чтобы это работало, нечистые функции должны иметь тождества и составлять.Поэтому T не может быть просто функтором, но должен быть монадой.[п.265]
Такое использование «вычислений» соответствует обычному представлению информатики о моделях вычислений (подробнее см. ответ Данидиаза )).В неофициальной литературе по функциональному программированию намеки на монады как на модели вычислений имеют разную степень точности.Тем не менее, они, как правило, основаны на строгой идее или, по крайней мере, являются ее следствием.