В обоснование Petr Pudlák's answer здесь приведено аргумент о происхождении более широкого понятия «эффект».
Фраза «effectful программирования» показывает в автореферате McBride и Паттерсон Applicative Programming with Effects, бумага, которая представила аппликативные функторы:
В этой статье мы вводим Applicative
функторов - абстрактную характеристику аппликативного стиля Эффективного программирования, слабее, чем Monad
и, следовательно, более широко распространены.
«Эффект» и «Эффективный» появляются в нескольких других отрывках из бумаги; эти последствия считаются совершенно незаметными, чтобы не требовать явного разъяснения. Например, это замечание сделано только после определения Applicative
представлена (стр. 3):
В каждом примере, есть конструктор типа f
, который встраивает обычное понятие стоимости, но поддерживает свой собственный своеобразный способ дать смысл обычного аппликативному языку [...] Мы, соответственно, ввести Applicative
класс:
[A Haskell определение из Applicative
]
Этого класса обобщающего S и K [т. the S and K combinators, которые отображаются в примере Reader
/function Applicative
экземпляра] из потоковой обработки среды для нарезки эффекта в целом.
Из этих цитат, мы можем сделать вывод, что в этом контексте:
эффекты являются вещи, которые Applicative
нити «в целом».
Эффекты связаны с конструкторами типов, которые даются Applicative
экземплярами.
Monad
также касается эффектов.
После этих выводов, мы можем проследить это использование «эффекта» по крайней мере к Wadler's papers on monads. Например, вот цитата из стр.6 монад для функционального программирования:
В общем, функция типа → б заменяется функцией типа → M б , Это может быть прочитано как функция, которая принимает аргумент типа и возвращает результат типа б, с возможным дополнительным эффектом, захваченного М. Этот эффект может заключаться в том, чтобы воздействовать на состояние, генерировать вывод, создавать исключение или что у вас есть.
И из тех же бумаг, страница 21:
Если монады инкапсулировать эффекты и списки формируют монаду, списки соответствуют некоторому эффекту? Действительно, они делают, и эффект, которым они соответствуют, - это выбор. Можно подумать о вычислении типа [a] как предлагающего выбор значений, по одному для каждого элемента списка. Монадический эквивалент функции типа a → b является функцией типа a → [b].
«соответствует некоторому эффекту» поворот фразы здесь является ключевым: она связывает назад к более простой претензии реферата:
Монады обеспечивают удобную структуру для моделирования эффектов найденную на других языках , таких как глобальное состояние, обработка исключений, вывод или недетерминизм.
Пек является то, что монады могут быть использованы для выражения то, что в «других языках», как правило, закодированных в виде побочных эффектов - то есть, как Петр Pudlák ставит его в ответ здесь, «наблюдаемый взаимодействие с [функциональной] средой (кроме вычисления ее значения результата) ». Благодаря метонимии это легко привело к тому, что «эффект» приобрел второе значение, более широкое, чем «побочный эффект», а именно то, что вводится через конструктор типов, который является экземпляром Monad
. Со временем этот смысл был далее обобщен, чтобы охватить другие классы функторов, такие как Applicative
, как видно из работы Макбрайда и Паттерсона.
В целом, я считаю, «эффект», чтобы иметь два разумных значений в Haskell просторечии:
В некоторых случаях можно избежать разногласия по терминологии происходит, когда каждая из участвующих сторон неявно предполагает различное значение «эффекта». Другой возможный спор заключается в том, является ли законным говорить об эффектах при работе с Functor
в одиночку, в отличие от подклассов, таких как Applicative
или Monad
(я считаю, что это нормально, по согласованию с Petr Pudlák's answer to Why can applicative functors have side effects, but functors can't?).
Возможно, полезно: https://slpopejoy.github.io/posts/Effectful01.html Он определяет * effectful * как: 1. Фактические побочные эффекты (IO) 2. Материал, который кажется побочным эффектом (State, Writer и т. д.) 3. Контексты, которые сохраняются над вызовами функций (Reader, State и т. д.). 4. Нелокальный поток управления (возможно, любой из них). –
Большинство монад определены в терминах чистого вычисления, но с точки зрения программиста принято думать, что 'State sa' является императивной процедурой, которая может читать/записывать состояние' s' с побочными эффектами и, наконец, произведите 'a'. Даже если это чисто, иногда бывает удобно притворяться, что это не так. По теме я бы сказал, что эффектные и с эффектами означают одно и то же, даже если они иногда применяются в широком смысле к значениям, обернутым в любую монаду/аппликативную, даже если они не моделируют побочные эффекты. – chi