Вопрос

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

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

Из Референциальная прозрачность:

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

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

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

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

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

Это было полезно?

Решение

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

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


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

Другие советы

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

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

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

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

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

Так что, я думаю, мы разобрались, какой может быть «чистота» и «побочные эффекты».

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

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

Эти слайды из одного разговора Accu2015 Имейте отличное резюме по теме референциальной прозрачности.

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

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

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

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

Из определений у нас есть, нет, это не так.

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

Пытаться слайды, которые я упомянул выше.

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

«В рамках специфического замедления x1, ..., xn, все возникновение выражения E, содержащего только переменные x1, ..., xn имеет одинаковое значение».

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

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

Который в 1 -м случае содержит, но во 2 -м случае это становится слишком странным.

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top