Почему "чистые" функции называются "чистыми"?

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

Почему слово "чистый" используется для описания функций с этими свойствами? Кто первым использовал слово "чистый" таким образом и когда? Существуют ли другие слова, которые означают примерно одно и то же?

Ответ 1

Чтобы ответить на ваш первый вопрос, математические функции часто описываются как "чистые" в терминах некоторых определенных переменных. например:.

первый член является чистой функцией от x, а второй член является чистой функцией y

Из-за этого я не думаю, что вы найдете истинное "первое" событие.

Для языков программирования небольшой поиск показывает, что Ada 95 (pragma Pure), Высокопроизводительный Fortran (1993) (PURE) и VHDL-93 (PURE) содержат формальные понятия "чистых функций".

Haskell (1990) довольно очевиден, но чистота не является явной. GCC C имеет различные атрибуты функций для разных уровней "чистого".

Несколько книг: Обоснование для языка программирования C (1990) использует этот термин, как и Языки программирования и их определениях (1984). Однако, по-видимому, они используют его только один раз! Программирование IBM Personal Computer, Pascal (также 1984) использует этот термин, но из ограниченного представления Google неясно, поддерживает ли его компилятор Pascal. (Я подозреваю, что нет.)

Интересно отметить, что у Грина, предшественника Ada, действительно было довольно строгое определение "функции" - даже распределение памяти было запрещено. Однако это было снято до того, как оно стало Ada, где функции могут иметь побочные эффекты (I/O или глобальные переменные), но не могут изменять их аргументы.

C28-6571-3 (первое справочное руководство PL/I, написанное перед компилятором) показывает, что PL/I поддерживал чистые функции в форме REDUCIBLE (= чистый), еще в 1966 году - когда компилятор был впервые выпущен. (Это также отвечает на ваш третий вопрос.)

Этот последний документ специально отмечает, что он включает REDUCIBLE в качестве нового изменения со времени документа C28-6571-2. Итак, REDUCIBLE, возможно, первое воплощение формальных чистых функций в языках программирования, появилось где-то между январем и июлем 1966 года.

Обновление: самый ранний экземпляр "чистой функции" в Google Groups в этом смысле - с 1988 года, который легко публикует ссылки на книги.

Ответ 2

Несколько мифов:

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

  • Термин не вытекает из императивного программирования. Ранние языки императивного программирования, Fortran, Algol 60, Pascal и т.д. Всегда имели два вида абстракций: "функции", которые давали результаты на основе их исходных данных и "процедур", которые вносили определенные вклад и делали действие. Считалось, что хорошая практика программирования для "функций" не имеет побочных эффектов. Им не нужно было иметь побочные эффекты, потому что всегда можно было использовать процедуры.

Итак, откуда еще взялся термин "чистый функционал"? Ответ - это нечто вроде очевидного. Он исходил из нечистых функциональных языков программирования, среди которых главным является Lisp. Lisp был спроектирован где-то между 1958 и 1960 годами (между первым и вторым сообщениями Алгола 60, проект которого был Маккарти, но не был удовлетворен). Конструкция Lisp основывалась на функциональном программировании. Однако это также позволило использовать побочные эффекты в качестве прагматичного выбора. У него не было понятия команды или процедуры. Итак, в Lisp, в основном, писали "чистые функции", но иногда писали "нечистые функции", т.е. Функции с побочными эффектами, чтобы что-то сделать. Термины "чистый Lisp" или "чисто функциональное подмножество Lisp" используются в течение длительного времени. Медленно, благодаря осмосу, эта идея "чистоты" стала вторгаться во все наше пространство.

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

Ответ 3

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

Ответ 4

Почему слово "чистый" используется для описания функций с этими свойствами?

Из Викисловарь > чистое # прилагательное

  • без недостатков или недостатков; незапятнанная
  • без посторонних материалов или загрязняющих веществ
  • без аморального поведения или качеств; чистая
  • ветки науки, сделанной ради нее самой, вместо того, чтобы служить другой отрасли науки.

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

Кто первым использовал слово "чистый" таким образом, а когда?

Я слишком молод, чтобы ответить на это с любой степенью уверенности. Я утверждаю, однако, что для описания функций, которые ведут себя таким образом, было бы неизбежно, что слово pure (или некоторый очень близкий синоним) будет использоваться таким образом.

Есть ли другие слова, которые означают примерно одно и то же?

Вы сами сказали: "ссылочно прозрачный". Однако вы, кажется, предполагаете, что "ссылочная прозрачность" охватывает только часть значения фразы "чистая функция". Я не согласен; Я чувствую, что это полностью синоним. Из Википедия > Референциальная прозрачность:

Выражение называется ссылочно прозрачным, если его можно заменить его значением без изменения поведения программы. (акцент мой)

Сообщество Haskell иногда использует прилагательное "безопасно" аналогичным образом. (См. Safe, чтобы избежать исключения исключений. Контраст с unsafePerformIO)

Я не могу думать о каких-либо других синонимах прямо сейчас.

Ответ 5

Понятие функции возникло в математике. Математическая концепция функции - это более или менее отображение из одного множества в другое. В этом смысле невозможно, чтобы функции имели побочные эффекты; не потому, что они "лучше", или потому, что они специально определены как не имеющие побочных эффектов, а потому, что концепция "наличия побочных эффектов" не имеет никакого смысла в этом определении функции. Математические функции - это не ряд шагов, которые выполняются, поэтому как любой из этих шагов каким-то образом "воздействует" на другие математические объекты, о которых вы говорите?

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

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