Что означает "монада - это модель вычислений"

Что это значит именно тогда, когда люди говорят: "Монада - это модель вычислений"? Означает ли это вычисление в смысле полноты по Тьюрингу? Если так, то как?

Пояснение: Этот вопрос не об объяснении монад, а о том, что люди имеют в виду под "моделью вычислений" в этом контексте и как это относится к монадам. Смотрите в конце этого ответа для типичного использования этой фразы.

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

Ответ 1

Идея монад как моделей вычислений восходит к работе Эудженио Могги. Среди практиков Хаскелла наиболее известной статьей Moggi по этому вопросу являются " Понятия вычислений как монад" (1991). Соответствующие цитаты включают в себя:

[Лямбда] -calculus считается полезным математическим инструментом при изучении языков программирования, поскольку программы можно идентифицировать с помощью [лямбда] -terms. Однако, если кто-то идет дальше и использует [бета] [эта] -conversion для доказательства эквивалентности программ, то вводится грубое упрощение (программы идентифицируются с полными функциями от значений к значениям), что может поставить под угрозу применимость теоретических результатов, В этой статье мы вводим исчисления, основанные на категориальной семантике для вычислений, которые обеспечивают правильную основу для доказательства эквивалентности программ для широкого спектра понятий вычислений. [п. 1]

[...]

Мы не берем в качестве отправной точки для доказательства эквивалентности программ теорию [beta] [eta] -conversion, которая идентифицирует обозначение программы (процедуры) типа A → B с полной функцией от A до B Так как эта идентификация полностью уничтожает поведение, такое как недопущение, недетерминизм и побочные эффекты, которые могут проявляться в реальных программах. Вместо этого мы действуем следующим образом:

    1. Мы берем теорию категорий как общую теорию функций и развиваем категориальную семантику вычислений на основе монад. [...] [п. 1]

[...]

Основная идея категориальной семантики, представленной ниже, заключается в том, что для интерпретации языка программирования в категории [C] мы отличаем объект A значений (типа A) от объекта TA вычислений (типа A), и принять за обозначения программ (типа А) элементы ТА. В частности, мы отождествляем тип A с объектом значений (типа A) и получаем объект вычислений (типа A), применяя унарный конструктор типа T к A. Мы называем T понятием вычисления, поскольку оно тезисы от типа значений, которые могут произвести вычисления. Существует много вариантов ТА, соответствующих различным понятиям вычислений. [Стр. 2-3]

[...]

Мы определили монады как важные для моделирования представлений о вычислениях, но вычислительные монады, кажется, обладают дополнительными свойствами; например, они имеют тензорную прочность и могут удовлетворять моно-требованиям. Вполне вероятно, что существуют другие свойства вычислительных монад, которые еще предстоит идентифицировать, и нет никаких оснований полагать, что такие свойства должны быть найдены в литературе по монадам. [п. 27 - спасибо Данидиаз]

В более ранней работе Moggi "Вычислительная лямбда -calculus и монады" (1989 - спасибо michid за ссылку) буквально говорится о "вычислительной модели [s]":

Вычислительная модель - это монада (T; [eta]; [mu]), удовлетворяющая требованию моно: [eta-A] является моно для каждого A [принадлежащего] C.

Существует альтернативное описание монады (см. [7]), которое легче обосновать в вычислительном отношении. [...] [п. 2]

Эта конкретная часть терминологии была опущена в понятиях вычислений как монады, поскольку Могги сосредоточил внимание на своей презентации на "альтернативном описании" (а именно, на троек Клейсли, которые на языке Хаскелла составлены конструктором типов, return и связывать). Суть, тем не менее, остается неизменной во всем.


Филип Уодлер представляет идею с более практичным уклоном в Monads для функционального программирования (1992):

Описано использование монад для структурирования функциональных программ. Монады предоставляют удобную структуру для моделирования эффектов, найденных в других языках, таких как глобальное состояние, обработка исключений, вывод или недетерминизм. [п. 1]

[...]

Чистые функциональные языки имеют это преимущество: весь поток данных делается явным. И этот недостаток: иногда это болезненно явно.

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

Именно в отношении модульности явный поток данных становится и благословением, и бичем. С одной стороны, это максимальная модульность. Все входящие и исходящие данные отображаются и доступны, обеспечивая максимальную гибкость. С другой стороны, это надир модульности. Суть алгоритма может быть захоронена под каналом, необходимым для переноса данных с момента создания до точки использования. [п. 2]

[...]

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

На чистом языке обработка исключений может быть имитирована введением типа для представления вычислений, которые могут вызывать исключение. [Стр. 3 -4 - обратите внимание, что это до того, как монады представлены как объединяющая абстракция.]

[...]

Каждая из вариаций интерпретатора имеет схожую структуру, которая может быть абстрагирована, чтобы дать понятие монады.

В каждом варианте мы вводили тип вычислений. Соответственно, M представляет вычисления, которые могут вызывать исключения, воздействовать на состояние и генерировать выходные данные. К настоящему времени читатель догадывается, что М обозначает монаду. [п. 6]

Это один из корней использования "вычисления" для обращения к монадическим значениям.


Таким образом, значительная часть более поздней литературы использует концепцию вычислений. Например, это вступительный отрывок " Понятия вычислений как моноидов", составленный Экскиэлем Ривасом и Мауро Яскелиоффом (2014 год - спасибо Данидиазу за предложение):

При построении семантической модели системы или при структурировании компьютерного кода, есть несколько понятий вычисления, которые можно рассмотреть. Монады (Moggi, 1989; Moggi, 1991) являются наиболее популярным понятием, но другие понятия, такие как стрелки (Hughes, 2000) и, совсем недавно, аппликативные функторы (McBride & Paterson, 2008) получили всеобщее признание. Каждое из этих понятий вычислений имеет особые характеристики, которые делают их более подходящими для некоторых задач, чем для других. Тем не менее, можно объединить все три различных понятия в рамках единой концептуальной основы. [п. 1]

Другим хорошим примером являются комонадические понятия вычислений Тармо Уусталу и Вармо Вене (2000):

После первоначальной работы Могги в конце 80-х годов монады, точнее, сильные монады, стали общепринятым инструментом для структурирования эффективных понятий вычислений, таких как вычисления с исключениями, выходные данные, вычисления с использованием среды, преобразование состояний, недетерминированные вероятностные вычисления и т.д. Идея состоит в том, чтобы использовать категорию Клейсли в качестве категории нечистых, эффективных функций, причем включение Клейсли дает вложение чистых функций из базовой категории. [...] [п. 263]

[...]

Отправной точкой в монадическом подходе к эффективному вычислению (вызов по значению) является идея о том, что нечистые, эффективные функции от A до B должны быть не чем иным, как чистыми функциями от A до TB. Здесь чистые функции живут в базовой категории C, а T является эндофунктором на C, который описывает понятие эффекта интереса; Полезно думать о TA как о типе эффективных вычислений значений данного типа A.

Чтобы это работало, нечистые функции должны иметь тождества и составлять. Поэтому T не может быть просто функтором, но должен быть монадой. [п. 265]


Такое использование "вычислений" соответствует обычным представлениям компьютерных моделей о моделях вычислений (подробности см. В ответе danidiaz). В неофициальной литературе по функциональному программированию намеки на монады как на модели вычислений имеют разную степень точности. Тем не менее, они, как правило, основываются на строгой идее или, по крайней мере, являются ее следствием.

Ответ 2

Ничего такого. Это ничего не значит. Это результат того, что кто-то пытается найти метафоры, которые превращают монады в то, что они уже знают. Это почти что-то значит. "Можно построить модели вычислений, которые образуют монады", например, является значимым утверждением. Но разница значительна. "Монады - это модели вычислений" - это попытка навязать широкую абстракцию узкой интерпретации. Другой указывает, что вы можете работать с более широкой абстракцией для одного варианта использования.

Будьте очень осторожны с объяснениями. Считаете ли вы, что все сообщество разработчиков будет продолжать использовать незнакомую терминологию, если знакомая терминология будет сообщать то же самое? Термин Monad на протяжении 20 лет используется в языковом сообществе, которое быстро изобретает и отбрасывает абстракции по мере поиска улучшений. Единственный способ, который может произойти, - это передать что-то полезное и точное.

Просто сложно написать объяснение применения идеи к программированию, которое имеет смысл для людей, которые недостаточно знают язык, чтобы понять используемые конструкции. Если вам неудобны хотя бы типы с более высоким родом, классы типов и функции более высокого порядка, нет никакого способа понять, что говорит нотация.

Изучение необходимых предпосылок поможет. Практика написания кода поможет. Анализ того, как (>>=) работает для различных конкретных типов, поможет. Поможет научиться пользоваться библиотекой вроде Parsec (или современными потомками вроде megaparsec).

Попытка заставить идею соответствовать чему-то, что вы уже знаете, через метафору, не будет.

Ответ 3

Если немного расширить ответ @duplode, я думаю, что, говоря о вычислениях, "модель" может иметь как минимум два немного разных значения.


Один из них - модель в смысле тезиса Черча-Тьюринга. Здесь модель - это способ выполнения вычислений, способный выразить любой алгоритм. Итак, машины Тьюринга, лямбда-исчисление, системы почтовой корреспонденции... все это модели.


Другой - модель в смысле семантики языка программирования. Идея состоит в том, что мы рассматриваем программы как составные синтаксические структуры, и мы хотим, чтобы они что-то "означали", в идеале таким образом, чтобы мы могли определить значение композиции из значения элементов. В этом смысле лямбда-исчисление имеет модели.

Теперь один вид семантики - это денотационная семантика, в которой значение, которое мы назначаем программе, представляет собой некий математический объект. Для тривиального примера рассмотрим двоичные числа. Здесь "программы" - это строки 0 и 1, которые рассматриваются как простые символы. И "модель" будет представлять собой натуральные числа вместе с функцией, которая отображает каждую строку символов на соответствующее натуральное число.

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