Концепция чистоты (также называемая ссылочной прозрачностью) очень важна в функциональном программировании. Фактически, можно сказать, что функциональное программирование - это программирование, направленное на чистоту. Так что же такое чистота? Это означает, что у вас не может быть побочных эффектов. Термин «побочный эффект» не относится к общей фразе, используемой в медицине для обозначения непредвиденных результатов. Позвольте мне проиллюстрировать побочный эффект программирования с помощью диаграммы.

Если вы посмотрите на функцию как на картинку, чистая функция просто принимает ввод и возвращает вывод.

Здесь у меня есть функция myFunction, которая находится в остальной части моего приложения. myFunction принимает на входе 3 и возвращает на выходе 9 *.

Если мы рассмотрим определение слова эффект:

изменение, которое является результатом или следствием действия или другой причины

Каков тогда эффект этой функции? Что это меняет? Что ж, он меняет 3 на 9.

И ничего больше.

Так почему же myFunction чистая? Есть две вещи, которые делают его чистым:

  • Имеет только один эффект
  • Это влияет только на его входы

Вот мои правила чистоты.

Теперь рассмотрим эту функцию:

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

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

Эта функция теперь имеет два эффекта:

  • Он меняет 3 на 9
  • Он записывает в базу данных

Теперь он нарушает оба правила - он имеет два эффекта и влияет на то, что не является одним из его входов - (база данных). Итак, очевидно, что это нечисто.

Но побочный эффект - это IO (ввод / вывод), что очень полезно! Фактически, если ваша программа не может принимать входные данные или производить выходные данные, трудно представить, как она вообще может быть полезна.

Так что делать? Что ж, вы можете попытаться свести к минимуму использование побочных эффектов - общий подход - побочные эффекты становятся секретом вины программистов. Программисты говорят об изолировании побочных эффектов, пытаясь свести их к одному месту. Другой подход - использовать монаду ввода-вывода - где вы можете выполнять столько операций ввода-вывода, сколько захотите, и при этом оставаться чистым!

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

val pureAndInnocent = IO { println("I'm a naughty side-effect!") }

То, что вы сделали, описывается побочным эффектом - на самом деле ничего не происходит, пока вы не вызовете pureAndInnocent.run (). Итак, pureAndInnocent, как следует из названия, чистое - даже если оно описывает что-то нечистое - на самом деле этого не происходит. Вы можете сказать: Эй, все, что вы делаете, это просто откладываете побочный эффект! и ты был бы прав. Но это работает, поверьте мне. Это все, что я сейчас скажу. В своем следующем посте я покажу вам, как интегрировать монаду ввода-вывода в (достаточно) реалистичную программу, создав чисто функциональный API.