Что такое ссылочная прозрачность?

Что означает термин ссылочная прозрачность в смысле? Я слышал, что это описывается как "это означает, что вы можете заменить равных равными", но это кажется неадекватным объяснением.

12 ответов


термин "ссылочная прозрачность" происходит от аналитическая философия, отрасль философии, которая анализирует конструкции естественного языка, утверждения и аргументы, основанные на методах логики и математики. Другими словами, это самый близкий предмет вне информатики к тому, что мы называем семантика языка программирования. Философ!--5-->Уиллард Куайн был ответственен за инициирование концепции ссылочной прозрачности, но это было также подразумевается в подходах Бертрана Рассела и Альфреда Уайтхеда.

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

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

Шотландский парламент собирается в столице Шотландии.

означает то же, что

Шотландский парламент собирается на Эдинбург.

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

с другой стороны, в предложении

Эдинбург был столицей из Шотландии с 1999 года.

мы не можем сделать такую замену. Если бы мы это сделали, мы бы получили "Эдинбург был Эдинбургом с 1999 года", что является сумасшедшей вещью, чтобы сказать, и не передает тот же смысл, что и исходное предложение. Итак, казалось бы, контекст "Эдинбурга" был... с 1999 года" является совершенно непрозрачным (противоположность совершенно прозрачна). Он, по-видимому, заботится о что-то больше чем то, что этот термин обозначает. Что это?

такие вещи, как "столица Шотландии" называются определенные термины

Шотландия имеет столицу с 1999 года, и эта столица-Эдинбург.

Это предложение не может быть преобразовано в ореховое. Проблема решена! Смысл Куайна состоял в том, чтобы сказать, что естественный язык беспорядочен или, по крайней мере, сложен, потому что он удобен для практического использования, но философы и логики должны внести ясность, правильно понимая их. Ссылочная прозрачность-это инструмент, который будет использоваться для приведения таких ясность смысл.

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

одним из наиболее полезных свойств выражений является то, что вызывается Quine referential прозрачность. По сути, это означает, что если мы хотим найти значение выражения, которое содержит под-выражение, единственное, что нам нужно знать о ПОД-выражении, это его значение. Любой другой особенности под-выражения, такие как его внутренняя структура, число и характер его компонентов, порядок их оценки или цвет чернил в которых они написаны, не имеют отношения к значению основного выражения.

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

мы можем спасти ситуацию. Мы сказали, что естественный язык " грязный, или, по крайней мере, сложный", потому что он сделан удобным для практического использования. Языки программирования такие же. Они "грязные или, по крайней мере, сложные", потому что они сделаны удобными для практического использования. Это не значит, что они должны нас смущать. Они просто должны быть поняты правильно, используя метаязык, который является референтно прозрачным, чтобы у нас была ясность смысла. В статье, которую я процитировал, Стрейчи делает именно это. Он объясняет значение императива языки программирования, разбивая их на элементарные понятия, никогда не теряют ясности нигде. Важной частью его анализа является указание на то, что выражения в языках программирования имеют два вида "значений", называемых l-значения и r-значения. До появления статьи Стрейчи этого не понимали, и царила полная неразбериха. Сегодня определение C упоминает об этом регулярно, и каждый программист C понимает это различие. (Будь то программисты в другие языки понимают это одинаково хорошо, трудно сказать.)

и Куайн, и Стрейчи были обеспокоены значением языковых конструкций, которые включают некоторую форму контекстной зависимости. Например, наш пример " Эдинбург был столицей Шотландии с 1999 года "означает, что" столица Шотландии " зависит от времени, в которое она рассматривается. Такая контекстная зависимость является реальностью, как в естественных языках, так и в языках программирования. Даже в функциональном Программирование, свободные и связанные переменные должны интерпретироваться в зависимости от контекста, в котором они появляются. Контекстная зависимость любого рода так или иначе блокирует ссылочную прозрачность. Если вы попытаетесь понять значение терминов независимо от контекста, от которого они зависят, вы снова окажетесь в замешательстве. Куайна интересовало значение модальной логики. Он держал это модальная логика было referentially непрозрачно и оно должно быть очищено вверх мимо перевод его в референтно прозрачную структуру (например, рассматривая необходимость как доказуемость). Он в значительной степени проиграл этот спор. Логики и философы находили возможную мировую семантику Крипке совершенно адекватной. Аналогичная ситуация характерна и для императивного программирования. Зависимость от состояния, объясненная Стрейчи, и зависимость от хранилища, объясненная Рейнольдсом (аналогично возможной мировой семантике Крипке), совершенно адекватны. Функциональные программисты не знают большая часть этих исследований. Их идеи о ссылочной прозрачности должны быть приняты с большой долей соли.

[дополнительное Примечание: приведенные выше примеры иллюстрируют, что простая фраза, такая как "столица Шотландии", имеет несколько уровней значения. С одной стороны, мы могли бы говорить о столице в настоящее время. На другом уровне мы могли бы говорить о всех возможных столицах, которые Шотландия могла бы иметь с течением времени. Мы можем "приблизиться" к определенному контексту и "уменьшить", чтобы охватить все контексты довольно легко в обычной практике. Эффективность естественного языка использует нашу способность делать это. Императивные языки программирования эффективны почти таким же образом. Мы можем использовать переменную x в правой части задания (r-значение) говорить о его значении в конкретном состоянии. Или, мы могли бы поговорить о его l-значение которая охватывает все государства. Людей такие вещи редко смущают. Однако они могут или не могут точно объяснить все уровни значения, присущие языковым конструктам. Все эти уровни значения не обязательно "очевидны", и изучение их должным образом-дело науки. Однако inarticulacy простых людей объяснить такие многослойные смыслы не означает, что они путаются в них.]

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


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

вот пример ссылочной прозрачной функции:

int plusOne(int x)
{
  return x+1;
}

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

другим хорошим примером является математика в целом. В математике, заданной функцией и входным значением, она всегда будет сопоставляться с тем же выходным значением. f (x) = x + 1. Поэтому функции в математике совершенно прозрачна.

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

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

--

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

//global G
int G = 10;

int plusG(int x)
{//G can be modified externally returning different values.
  return x + G;
}

Другим примером является функция-член в объектно-ориентированном языке программирования. Функции-члены обычно работают с переменными-членами и поэтому быть ссылочным непрозрачным. Функции-члены, хотя, конечно, могут быть ссылочно прозрачными.

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


похожий прозрачный функция-это функция, которая зависит только от входных данных.


[Это постскриптум к моему ответу от 25 марта, в попытке приблизить Обсуждение к проблемам функционального / императивного программирования.]

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

  • в то время как философы/логики используют такие термины, как "ссылка", "обозначение", "обозначение" и "bedeutung" (немецкий термин Фреге), функциональные программисты используют термин "ценность". (Это не совсем их рук дело. Я замечаю, что Ландин, Стрейчи и их потомки также использовали термин "ценность", чтобы говорить о ссылке/денотации. Это может быть просто терминологическое упрощение, которое ввели Ландин и Стрейчи, но, похоже, это имеет большое значение, когда используется наивным способом.)

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

  • они, похоже, считают, что эти "значения" должны быть получены путем оценки.

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

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

Это полностью противоречит тому, что говорят философы/логики. Они говорят, что контекст является ссылочным или ссылочно прозрачным, если выражение в этом контексте может быть заменено другим выражение это относится к тому же самому (a coreferential выражение). Кто эти философы / логики? Они включают Фреге, Рассел, Уайтхед, Карнапа, Куайн, Церковь и многие другие. Каждый из них-сильная личность. Объединенная интеллектуальная сила этих логиков, мягко говоря, потрясает. Все они единодушны в том, что референты / денотации существуют вне формального языка, а выражения внутри языка могут только говорить о них. Итак, все, что можно сделать в язык должен заменить одно выражение другим выражением, которое ссылается на ту же сущность. Сами референты / денотации не существуют в пределах языка. Почему функциональные программисты отклоняются от этой устоявшейся традиции?

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

Ландин:

(a) каждое выражение имеет гнездование структура подвыражения, (b) каждое подвыражение обозначает что-то (обычно число, значение истины или числовая функция), (c) вещь, обозначаемая выражением, т. е. его "значение" зависит только от значений его sub- выражений, а не по другим свойствам их. [Подчеркнуто]

Стой:

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

птица и Вадлер:

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

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

  • Strachey интерпретировал переменные в императивных языках программирования как L-значения, как упоминалось в моем ответе от 25 марта, который является сложным концептуальным объектом, который не имеет прямого представления в синтаксисе языка программирования.
  • Он также интерпретировал команды на таких языках, как функции состояния к состоянию, еще один экземпляр сложного математического объекта, который не является "значением" в синтаксисе.
  • даже побочный вызов функции в C имеет четко определенное " значение "в качестве преобразователя состояния, который отображает состояния на пары состояний и значений (так называемая" монада " в терминологии функциональных программистов).

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

немного истории может пролить свет на то, как эти путаницы возникли. Период с 1962 по 1967 год был очень интенсивным для Кристофера Стрейчи. Между 1962-65, он занимает часть времени работа в качестве научного сотрудника с Морисом Уилксом для разработки и реализации языка программирования, который стал известен как CPL. Это был императивный язык программирования, но он также должен был иметь мощные функциональные возможности языка программирования. Ландин, работавший в консалтинговой компании Стрейчи, оказал огромное влияние на его взгляды на языки программирования. В знаковой статье 1965 года"следующие 700 языков программирования", Ландин беззастенчиво повышает функциональные языки программирования (называя их денотативное languages) и описывает императивные языки программирования как их "антитезу". В ходе последовавшей дискуссии мы обнаружили, что Стрейчи ставит под сомнение сильную позицию Ландина.

... Форма DLs подмножество всех языков. Они интересные подмножества, но что неудобно использовать, если вы к этому не привыкли. Нам нужно их потому что на данный момент мы не знаем, как строить доказательства с языками, которые включают императивы и прыжки. [Подчеркнуто]

Основные понятия в языках программирования " в Копенгагенской летней школе. Лекции должны были быть опубликованы, но "к сожалению, из-за задержки редактирование, материалы никогда не материализовались; как большая часть работы Стрейчи в Оксфорде, однако, газета имела влиятельный частный тираж."(Мартин Кэмпбелл-Келли) Основные понятия " легко доступны в интернете, нет нужно прибегнуть к догадкам. Мы должны прочитать его и решить, что имел в виду Стрейчи. В частности:
  • в разделе 3.2 он имеет дело с" выражениями", где он говорит о"ссылочной прозрачности R-значения".
  • его раздел 3.3 касается "команд", где он говорит о"L-значной ссылочной прозрачности".
  • в разделе 3.4.5 он говорит о "функциях и процедурах" и заявляет ,что " любое отклонение референтного значения R прозрачность в контексте R-значения должна либо быть устранены путем разложения выражения на несколько команд и проще выражения, или, если это окажется сложным, предмет комментария."

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


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


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


Если вас интересует этимология (т. е. почему это понятие имеет именно такое название), посмотрите на мой блоге по теме. Терминология происходит от философа/логика Куайна.


для тех, кто нуждается в кратком объяснении, я рискну один (но прочитайте раскрытие ниже).

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

f x = x + x,

легкость, с которой вы можете (безопасно) заменить f (foo) на foo + foo в области этого определения, не имея слишком много ограничений на то, где вы можете выполнить это сокращение, является хорошим показателем того, сколько ссылочной прозрачности имеет ваш язык программирования.

например, если бы foo были x++ в смысле программирования C, вы не могли бы безопасно выполнить это сокращение (то есть, если бы вы должны были выполнить это сокращение, вы бы не закончили с той же программой, с которой вы начали).

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

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


  1. Денотационная семантика основана на моделировании языков путем построения доменов, которые составляют денотабельные значения.
  2. функциональные программисты используют термин стоимостью для описания сходимости вычисления, основанного на правилах перезаписи языка ie. его операционная семантика.

в 1 есть ясность двух языков, о которых идет речь:

  • моделируемый объект, объект язык
  • язык моделирования, метаязык

в 2, благодаря близости объекта и метаязыков, их можно спутать.

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

Итак, профессор Редди, позвольте мне перефразировать вас так: -)

в контексте функционального программирования и семантики, термин Referential Прозрачность is не является прозрачным.


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

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


следующий ответ, я надеюсь, добавляет и квалифицирует спорный 1-й и 3-й ответы.

допустим, что выражение обозначает или означает какой-то референт. Однако возникает вопрос, Могут ли эти референты быть закодированы изоморфно как часть самих выражений, называя такие выражения "значениями". Например, литеральные числовые значения являются подмножеством набора арифметических выражений,значения истинности-подмножеством набора булевых выражений и т. д. Идея чтобы оценить выражение до его значения (если оно есть). Таким образом, слово "значение" может относиться к обозначению или к отличительному элементу набора выражений. Но если существует изоморфизм (биекция) между референтом и ценность можно сказать, что это одно и то же. (Это сказанное, нужно быть осторожным определить в референты и изоморфизм, как доказано области же семантика. Чтобы привести пример, упомянутый в ответах на 3-й ответ, определение алгебраического типа данных data Nat = Zero | Suc Nat не соответствуют, как и ожидалось, множеству натуральных чисел.)

Давайте писать E[·] для выражения с отверстием, также известный в некоторых кругах как "контекст". Два примера контекста для C-подобных выражений:[·]+1 и [·]++.

Давайте писать [[·]] для функции, которая принимает выражение (без отверстия) и передает его значение (референт, обозначение и т. д.).) в некоторых Вселенная, обеспечивающая смысл. (Я заимствую обозначения с поля из денотационная семантика.)

давайте несколько формально адаптируем определение Куайна следующим образом: контекст E[·] является ссылочно прозрачным iff, учитывая любые два выражения E1 и E2 (без отверстий есть) такие, что [[E1]] = [[E2]] (т. е. выражения, обозначения/обозначения-в тот же референт), то это так, что [[E[E1]]] = [[E[E2]]] (т. е. заполнение отверстие с E1 или E2 результаты в выражениях, которые также обозначают одно и то же референт.)

правило Лейбница замена equals на equals обычно выражается как ' if E1 = E2 затем E[E1] = E[E2]', который говорит, что E[·] функция. Функция (или Программа расчета) функция отображение с источник к цели, чтобы для каждого источника был не более одного целевого элемента элемент. Недетерминированные функции являются неправильными, они являются либо отношениями, функции поставляя комплекты, etc. Если в правлении Лейбница равенство = is денотационные, то двойные скобки просто воспринимается как должное и игнорированной. Таким образом, референциально прозрачный контекст является функцией. И правило Лейбница является основным ингредиентом эквационного рассуждения, поэтому эквационное рассуждение определенно связано с референтной прозрачностью.

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

теперь, если E1 is выражение и E2 это значение, которое мы имеем, что я думаю, подразумевается большинством людей при определении ссылочной прозрачности с точки зрения выражений, ценностей и оценки. Но, как показано в 1-м и 3-м ответах на этой странице, это неточное определение.

проблема с контекстами, такими как [·]++ не является побочным эффектом, но его значение не определено в C изоморфно его значению. Функции не значения (ну, указатели на функции), тогда как в это языки функционального программирования. Landin, Стрейчи и пионеры денотационной семантики были достаточно умны в использование функциональных миров для придания смысла.

для императивных C-подобных языков мы можем (грубо) предоставить семантику выражения, использующие функцию [[·]] : Expression -> (State -> State x Value).

Value - это подмножество Expression. State содержит пар (значение идентификатора.) Семантическая функция принимает выражение и поставляет как его значение-функция от тока состояние в паре с обновленным состояние и значение. Например, [[x]] функция из текущего состояния к паре, первый компонент которой является текущим состоянием, а второй компонент-это значение x. Напротив,[[x++]] функция от текущее состояние пары, первым компонентом которой является состояние, в котором значение x увеличивается, и второй компонент которого является тем самым значением. В этом смысл, контекст [·]++ - это совершенно прозрачна, если он удовлетворяет этот определение дано выше.

я думаю, что функциональные программисты имеют право использовать ссылочную прозрачность том смысле, что они, естественно, восстановить [[·]] как функция от выражений к значениям. Функции являются первоклассными значениями, и состояние также может быть значением, а не обозначение. Монада государства (частично) является чистым механизмом для прохождения (или threading) государство.


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

Референциальной Прозрачности

выражение referential transparency используется в различных областях, таких как математика, логика, лингвистика, философия и программирование. В каждой из этих областей оно имеет совершенно разное значение. Здесь мы будем иметь дело только с компьютерными программами, хотя мы покажем аналогию с математикой (простая математика, не волнуйтесь). Обратите внимание, однако, что компьютерные ученые не согласны со значением ссылочной прозрачности в программирование. Мы рассмотрим ссылочную прозрачность, поскольку она используется функциональными программистами.

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

x = 2 + (3 * 4)

мы можем заменить подвыражение (3 * 4) любым другим выражением, имеющим то же значение без изменения результат (значение x). Самое очевидное выражение для использования, конечно, 12:

x = 2 + 12

любое другое выражение, имеющее значение 12 (возможно (5 + 7)), можно использовать без изменения результата. Как следствие, подвыражение (3 * 4) является референтно прозрачным.

мы также можем заменить выражение 2 + 12 другим выражением, имеющим то же значение без изменения значения x, поэтому оно также является ссылочно прозрачным:

x = 14

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

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

int add(int a, int b) {
        return a + b
    }

int mult(int a, int b) {
        return a * b;
    }

int x = add(2, mult(3, 4));

в этом примере метод mult является ссылочно прозрачным, поскольку любой вызов к нему может быть заменен соответствующим возвращаемым значением. Это можно заметить, заменив мульт (3, 4) на 12:

int x = add(2, 12)

таким же образом, add(2, 12) может быть заменен соответствующим возвращаемым значением, 14:

int x = 14;

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

С другой стороны, рассмотрим следующую программу:

int add(int a, int b) {
    int result = a + b;
    System.out.println("Returning " + result);
    return result;
}

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

public static void main(String... args) {
    printFibs(10);
}

public static void printFibs(int limit) {
    Fibs fibs = new Fibs();
    for (int i = 0; i < limit; i++) {
        System.out.println(fibs.next());
    }
}

static class Fibs {
    private int previous = -1;
    private int last = 1;

    public Integer next() {
        last = previous + (previous = last);
        return previous + last;
    }
}

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

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

ссылочная прозрачность в императивном Программирование Как императивное, так и функциональное программирование используют функции. Хотя функциональное программирование использует только функции, императивное Программирование использует:

  • чистые функции: методы, возвращающие значения и не имеющие других эффектов
  • pure effects: методы, возвращающие ничего, кроме изменения чего-то вне их)
  • функции с побочными эффектами: методы, возвращающие значение и изменить что-то

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