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

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

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

5 ответов

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

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

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

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

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

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

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

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

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

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

Пара мифов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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