Чистота против прозрачности ссылок

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

Википедия поддерживает отдельные статьи для этих концепций и говорит:

От Ссылочная прозрачность:

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

Из Чистые выражения:

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

Я нахожу эти утверждения запутанными. Если побочные эффекты от так называемой "нечистой функции" несущественны, чтобы позволить их не выполнять (т.е. Заменить вызов такой функции своим значением) без существенного изменения программы, она такая же, как если бы она была чистой в первое место, не так ли?

Существует ли более простой способ понять различия между чистым выражением и ссылочно-прозрачным, если таковые имеются? Если есть разница, то будет оценено примерное выражение, наглядно демонстрирующее его.

Ответ 1

Если я соберу в одном месте любых трех теоретиков моего знакомого, по крайней мере два из них не согласятся на значение термина "ссылочная прозрачность". И когда я был молодым учеником, мой наставник дал мне статью, объясняющую, что даже если вы считаете только профессиональную литературу, фраза "ссылочно прозрачная" используется для обозначения как минимум трех разных вещей. (К сожалению, этот документ находится где-то в коробке перепечаток, которые еще предстоит проверить. Я искал Google Scholar для этого, но я не имел успеха.)

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


P.S. В любой теме, связанной с семантикой языков программирования, Wikipedia ненадежна. Я отказался от попытки исправить это; Википедический процесс, похоже, рассматривает изменения и популярное голосование за стабильность и точность.

Ответ 2

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

Однако возможно иметь ссылочные прозрачные функции, которые не являются чистыми. Я могу написать функцию, которой задан int i, затем генерирует случайное число r, вычитает r из себя и помещает его в s, а затем возвращает i - s. Очевидно, что эта функция нечиста, потому что она генерирует случайные числа. Тем не менее, он является ссылочно прозрачным. В этом случае пример глупый и изобретательный. Однако, например, в Haskell, функция id имеет тип a - > a, тогда как моя функция stupidId имеет тип a -> IO a, указывающий, что она использует побочные эффекты. Когда программист может гарантировать посредством внешнего доказательства, что их функция на самом деле прозрачна, тогда они могут использовать unsafePerformIO, чтобы удалить IO обратно от типа.

Ответ 3

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

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

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

Итак, я догадываюсь, что мы выяснили, что такое "чистота" и "побочные эффекты".

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

Надеюсь, это поможет.

Ответ 4

Эти слайды из одной беседы ACCU2015 имеют большое резюме по теме ссылочной прозрачности.

Из одного из слайдов:

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

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

[...] он такой же, как если бы он был чистым в первую очередь, не так ли?

Из определений мы имеем нет, это не так.

Существует ли более простой способ понять различия между чистым выражением и ссылочно-прозрачным, если таковые имеются?

Попробуйте слайды, о которых я говорил выше.

Ответ 5

Я приведу то, что Джон Митчелл написал в своей книге Концепция в языке программирования. Я не помню это по строкам, но он определяет, что чистый функциональный язык должен пройти декларативный языковой тест, который:

"В рамках конкретного замедления x1,..., xn все вхождение выражения e, содержащего только переменные x1,..., xn, имеют одинаковое значение."

Вкратце, поскольку все остальные упоминаются бесплатно от побочных эффектов или побочных эффектов ( "Недостаток" побочных эффектов).

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

Что в первом случае имеет место, но во втором случае он становится слишком странным.

Случай 1:   "Я видел, как Уолтер попал в новый автомобиль .

И если Уолтер владеет Центром, мы могли бы заменить это в данном предложении как:

"Я видел, как Уолтер попал в его Centro"

Вопреки первому:

Случай №2: Его назвали Уильямом Руфусом из-за его прочитанной бороды.

Руфус означает несколько красный, и ссылка на Уильяма IV в Англии.

"Его назвали Уильямом IV из-за его прочитанной бороды". выглядит слишком неудобно.

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

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

Так что дайте это, это отличный совет, но получить его можно также хорошо выглядеть в этом контексте.