В некоторых языках есть способы отслеживания таких свойств, как чистота или наличие / отсутствие исключений во время компиляции.Тот факт, что они делают такого рода, напоминает систему эффектов.
Кажется, что есть две широкие категории этих систем, подобных эффектам, одна, в которой любое значение может быть «заключено в эффект», как моно ввода-вывода.в 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
применяется к самой функции, фактически давая вам другой типконструктор чем ->
.