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

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

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


person MatrixFrog    schedule 13.10.2011    source источник
comment
Ура, наконец, вопрос [этимологии]. Такие не часто встречаются :)   -  person porges    schedule 13.10.2011
comment
потому что побочные эффекты это зло?   -  person GogaRieger    schedule 14.10.2011
comment
дополнение к этому вопросу: кто, где, когда и почему начал использовать функцию имени для вещей, которые совершенно очевидно не являются таковыми?   -  person just somebody    schedule 15.12.2011
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что этот вопрос не касается практической проблемы программирования, как указано в справочном центре. .   -  person Martijn Pieters    schedule 06.03.2015


Ответы (5)


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

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

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

Для языков программирования небольшой поиск показывает, что Ada 95 (pragma Pure), < a href="http://www.vcpc.univie.ac.at/information/mirror/HPFF/hpf1/hpf-v10/subsubsection2REDUCIBLE3pragma Pure1.html">Высокопроизводительный Фортран (1993) (PURE) и VHDL-93 (pure) содержат формальные понятия "чистых функций".

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

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

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

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

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

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

person porges    schedule 13.10.2011
comment
Я думаю, вы имеете в виду usenet, потому что группы Google не существовали в 1988 году. Если текущие группы Google не объединяют старые (список рассылки?) архивы за пределами групп новостей usenet той эпохи, в этом случае это просто инструмент для поиска в архивах usenet. - person Peter Cordes; 05.03.2019
comment
Нет, я действительно имею в виду группы Google. Я искал группы Google, я не искал Usenet. У меня нет личного архива Usenet, и я не предполагаю, что в группах Google есть полный архив всех когда-либо сделанных сообщений Usenet. Группы Google также включают свои собственные форумы, не относящиеся к Usenet, поэтому наборы «сообщений в Usenet» и «сообщений в группах Google» не совпадают. ???? - person porges; 07.03.2019
comment
Кроме того, стоит отметить, что с 2015 года Google удалил функцию поиска по дате, поэтому этот поиск больше невозможен: motherboard.vice.com/en_us/article/jp5a77/ - person porges; 07.03.2019
comment
Хорошо, это справедливое замечание, просто формулировка звучит немного странно. - person Peter Cordes; 07.03.2019

Пара мифов:

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

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

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

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

person Uday Reddy    schedule 24.03.2012
comment
Хм, я не уверен. Функции в Алголе, Паскале и т. д., как правило, не были чистыми, поэтому уже было место для различия. Я считаю более правдоподобным думать, что этот термин уже использовался среди императивных программистов, чем полагать, что он был заимствован из чего-то столь же эзоторического (в то время), как функциональное программирование. В любом случае, это не неочевидное слово для использования ... Реальный вопрос, похоже, заключается в том, когда люди начали называть процедуры «функциями»? - person Andreas Rossberg; 24.03.2012
comment
Я хочу сказать, что в императивном программировании нет идеи чистоты. Если бы он был, он должен был бы относиться к чистому императивному программированию. Что это такое? С другой стороны, идея чистого Лиспа закрепилась, как только люди начали использовать Лисп. См., например, McCarthy. Чистота и нечистота — это идеи функционального программирования. Они не имеют ничего общего с императивным программированием. - person Uday Reddy; 24.03.2012
comment
Когда люди начали называть процедуры «функциями»? Что ж, Лисп сделал это, как я только что упомянул. Кажется, круги Лондона, Кембриджа и Массачусетского технологического института не заботились о том, чтобы провести различие между ними. В книге Кристофера Стрейчи «Разновидности языка программирования» есть такое загадочное замечание о PAL (педагогическом алгоритмическом языке), разработанном в Массачусетском технологическом институте: В PAL есть только один вид процедур (или функций). - person Uday Reddy; 25.03.2012
comment
@AndreasRossberg: обратите внимание, что по закону ожидается, что функции в Algol и Pascal не будут иметь побочных эффектов (имеется в виду чистые?), потому что эти языки не определяют порядок оценки для подвыражений. Круги Лондон-Кембридж-MIT (ISWIM, BCPL, PAL) определили точный порядок оценки и, таким образом, допускали побочные эффекты. Итак, я полагаю, что именно здесь потеряно различие между процедурами и функциями. - person Uday Reddy; 25.03.2012
comment
Я мог бы быть недобрым, приписывая побочные эффекты лондонско-кембриджским кругам. В статье о CPL есть следующий абзац, описывающий результат выражений: могут быть определены другие локальные переменные, а тело не может содержать операций, таких как присваивания нелокальным переменным, которые могут вызвать побочные эффекты. Таким образом, только некоторые люди в Лондоне и Кембридже, возможно, были ответственны за терпимость к побочным эффектам, а не все. С другой стороны, побочные эффекты в Массачусетском технологическом институте кажутся совершенно нормальными. - person Uday Reddy; 28.03.2012

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

person Ignacio Vazquez-Abrams    schedule 13.10.2011
comment
В математике слово функция означает то, что программисты назвали бы чистой функцией. Но во многих императивных языках программирования функция означает процедуру — действие, которое принимает некоторый ввод (или нет), затем, возможно, изменяет какое-то состояние или выполняет ввод-вывод, а затем возвращает некоторый вывод (или нет). Таким образом, чистая функция — это способ сказать функцию, как в математической функции. Но у меня вопрос, почему чистый? Почему не математическая функция или функция без ввода-вывода или что-то в этом роде? - person MatrixFrog; 13.10.2011
comment
Я не знаю исторических истоков использования чистого программирования, но мне интересно, связано ли это также с чистой и прикладной математикой. - person ivanm; 13.10.2011
comment
@MatrixFrog, это потому, что математика чистая, простая и красивая, а монада глобального состояния уродлива и грязна. Вот почему функции чисты, а процедуры не совсем так. - person SK-logic; 13.10.2011
comment
@MatrixFrog: предложенные вами альтернативы неоптимальны: функция, которая принимает строку и возвращает версию, состоящую из всех заглавных букв, является чистой, но не очень математической, в то время как функция, генерирующая псевдослучайные числа, может не выполнять ввод-вывод, но все же нечиста. - person ; 13.10.2011
comment
@Rahul: почему не очень математически? Это изоморфизм от свободного моноида строчных букв до свободного моноида прописных букв :) - person Tom Crockett; 13.10.2011
comment
@pelotom: Конечно, и в ответ я, вероятно, мог бы начать приводить примеры о базах данных сотрудников и налоговых ставках. :) Но я хочу сказать, что если вы начнете называть функции категоризацией математическими и нематематическими, это будет звучать как вопрос о том, выполняют ли они числовые вычисления или нет. - person ; 13.10.2011
comment
@Rahul: какие бы числовые коннотации вы ни придавали слову «математический», значение математической функции однозначно и не имеет ничего общего с числами. - person Tom Crockett; 13.10.2011

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

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

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

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

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

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

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

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

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

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

Других синонимов сейчас не придумаешь.

person Dan Burton    schedule 13.10.2011

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

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

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

person Ben    schedule 13.10.2011
comment
+1 Я недостаточно взрослый, чтобы действительно понимать, о чем я болтаю, но я догадывался, что чистота возникла из 1. компьютерные подпрограммы в целом представляют собой (математические) функции плюс побочные эффекты и 2. подпрограммы, которые воздерживаются от создания побочных эффектов, таким образом, являются подпрограммами минус побочные эффекты, как, например, о, это чисто математическая функция. чисто ‹-› просто, чисто ‹-› просто. - person just somebody; 15.12.2011
comment
Исторически алгоритмы возникли в математике и, вероятно, предшествовали функциям как минимум на тысячелетие. И функции предшествуют наборам на другое тысячелетие. Сколько из математических алгоритмов могли быть функциональными и сколько из них могло включать изменение состояния, еще полностью не известно. Но, конечно же, математические расчеты производились на счетах, и эти алгоритмы включали изменение состояния. Картина, которую вы нарисовали, есть отражение того, как протекает наше собственное образование в современную эпоху, но она не имеет исторической основы. - person Uday Reddy; 29.07.2012
comment
@UdayReddy В то время, когда появилось изучение вычислений, математическое понятие функции уже было хорошо известно в его современном значении. Моя точка зрения заключалась в том, что современная математическая функция предшествует (императивному) программистскому понятию функции, и именно поэтому программные функции, которые более точно моделируют математические функции, называются чистыми. Использовали ли математики древности алгоритмы с участием состояния или нет, совершенно не имеет отношения как к тому, что я написал в этом ответе, так и к обсуждаемой теме. - person Ben; 30.07.2012
comment
@Бен: Спасибо. Перечитывая ваш ответ, я нахожу его вполне безупречным, за исключением незначительной ссылки на императивные языки. Я предложил отредактировать. - person Uday Reddy; 30.07.2012