Название для систем, подобных Эффектам, которые аннотируют только типы функций - PullRequest
0 голосов
/ 09 июня 2018

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

Кажется, что есть две широкие категории этих систем, подобных эффектам, одна, в которой любое значение может быть «заключено в эффект», как моно ввода-вывода.в Haskell и в котором аннотируются только функции (например, noexcept в C ++ или проверенные исключения в Java).constexpr в C ++ - это странный случай, о котором я не знаю, как думать, и намеренно игнорирую, поскольку это означает совершенно разные вещи применительно к функции и не функциональному значению.

Мне интересно, что вы называете стиль отслеживания эффектов Haskell-IO-Monad против стиля проверенных исключений.Кажется, единственная причина, по которой вы бы использовали последний вариант - это обратная совместимость с языком, который не отслеживает интересующий вас эффект.

Более конкретно, Haskell отслеживает эффекты на уровне типа через IO Monad.

a -> b - это тип чистой функции без побочных эффектов.Нечистые функции возвращают значение IO, которое имеет специальный статус в среде выполнения / семантике Haskell.

Ближайшим эквивалентом нечистой функции в других языках будет что-то вроде

a -> IO b или, иначе говоря, вычисление, производящее b, параметризованное a.Конструктор типа -> по-прежнему имеет то же значение pure function, что и раньше.

C ++ имеет различие между функциями, которые могут потенциально генерировать исключения (по умолчанию), и функциями, которые не могут.

int add(int x, int y) noexcept {
    return x + y;
}

Однако невозможно пометить не-функцию как noexcept.

// BAD!
int x noexcept = <expr>;

noexcept применяется к самой функции, фактически давая вам другой типконструктор чем ->.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...