Идемпотентные функции - это то же самое, что и чистые функции?

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

Они эквивалентны?

9 ответов

Решение

Идемпотентная функция может вызывать идемпотентные побочные эффекты.

Чистая функция не может.

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

Чистая функция - это функция без побочных эффектов, выход которой определяется только вводом, то есть вызов f(x) даст тот же результат, независимо от того, сколько раз вы называете это.

Идемпотентная функция - это функция, которая может применяться несколько раз без изменения результата, то есть f(f(x)) такой же как f(x),

Функция может быть чистой, идемпотентной, обеих или ни одной.

Нет, идемпотентная функция изменит состояние программы / объекта / машины - и сделает это изменение только один раз (несмотря на повторные вызовы). Чистая функция ничего не меняет и продолжает выдавать (возвращать) результат при каждом вызове.

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

Каждая чистая функция является идемпотентом побочных эффектов, потому что чистые функции никогда не вызывают побочных эффектов, даже если они вызываются более одного раза. Однако идемпотентность возвращаемого значения означает, что f(f(x)) = f(x), что не зависит от чистоты.

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

Из википедии ( https://en.wikipedia.org/wiki/Idempotence)

В информатике термин идемпотент используется более всесторонне для описания операции, которая даст одинаковые результаты при выполнении один или несколько раз. Это может иметь различное значение в зависимости от контекста, в котором оно применяется. Например, в случае вызовов методов или подпрограмм с побочными эффектами это означает, что измененное состояние остается тем же после первого вызова. Однако в функциональном программировании идемпотентная функция - это функция, которая имеет свойство f(f(x)) = f(x) для любого значения x.

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

Определения:

  • Чистый:f(x)всегда возвращает одно и то же значение для данногоx.
  • Идемпотент:f(f(x)) = f(x).

Примеры

Не чистый, не идемпотентный

      def f(x):
    return random()

Проверять:

      f(0) = 0.2171
f(0) = 0.3142       # Thus, impure.

Чистый, но не идемпотентный

      def f(x):
    return x + 1

Проверять:

      f(0) = 1
f(0) = 1  # Thus, pure.
f(1) = 2  # Thus, not idempotent since f(0) != f(f(0)).

Чистый и идемпотентный

      def f(x):
    return round(x)

Проверять:

      f(0.3142) = 0
f(0.3142) = 0  # Thus, pure.
f(0) = 0       # Thus, idempotent.

Я нашел больше мест, где "идемпотент" определяется как f(f(x)) = f(x)но я действительно не верю, что это правда. Вместо этого я думаю, что это определение более точное (но не полностью):

описание действия, которое при многократном выполнении над одним и тем же объектом не оказывает дальнейшего воздействия на его объект после первого выполнения. Оператор проекции идемпотентен.

Как я это интерпретирую, если мы применим f на x (предмет) дважды как:

е (х); е (х);

тогда (побочный) эффект такой же, как и

f(x);

Поскольку чистые функции не допускают побочных эффектов, чистые функции также тривиально "идемпотентны".


Более общее (и более точное) определение idempotent также включает такие функции, как

переключатель (x)

Мы можем сказать degree из idempotency переключателя равно 2, потому что после применения toggle каждые 2 раза мы всегда получаем одно и то же State

После прочтения этого объяснения больше не требуется: https://szymonkrajewski.pl/what-is-idempotence/

Чистая функция = идемпотент + без изменений во входных переменных.

Другие вопросы по тегам