Вопрос

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

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

Решение

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

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

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

Заседание шотландского парламента проходит в столице Шотландии.

означает то же самое , что и

Заседание шотландского парламента проходит в Эдинбурге.

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

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

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

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

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

Столица Шотландии существует с 1999 года, и этой столицей является Эдинбург.

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

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

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

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

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

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

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

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

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

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

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

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

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

Приземляющийся:

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

Стой:

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

Берд и Уодлер:

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

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

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

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

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

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

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

В 1965 году Стрейчи занял должность читателя в Оксфорде и, по-видимому, работал практически полный рабочий день над разработкой теории императивов и скачков.К 1967 году у него была готова теория, которую он преподавал в своем курсе по "Фундаментальные понятия в языках программирования- в Копенгагенской летней школе.Конспекты лекций должны были быть опубликованы, но "к сожалению, из-за проволочек редактирование разбирательства и не состоялась;однако, как и большая часть работ Стрейчи в Оксфорде, газета имела влиятельный частный тираж ". (Мартин Кэмпбелл-Келли)

Трудность получения работ Стрейчи могла привести к распространению путаницы, когда люди полагались на вторичные источники и слухи.Но теперь, когда "Фундаментальные понятия"легко доступен в Интернете, нет необходимости прибегать к догадкам.Мы должны прочитать это и составить собственное мнение относительно того, что имел в виду Стрейчи.В частности:

  • В разделе 3.2 он рассматривает "выражения", где он говорит о "ссылочной прозрачности R-значения".
  • Его раздел 3.3 посвящен "командам", где он говорит о "прозрачности ссылок по L-значению".
  • В разделе 3.4.5 он говорит о "функциях и подпрограммах" и заявляет, что "любое отклонение от ссылочной прозрачности R-значения в контексте R-значения должно либо устраняться путем разложения выражения на несколько команд, либо упрощаться выражения, или, если это окажется трудным, предмет комментария ".

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

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

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

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

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

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

f x = x + x,

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

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

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

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

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

В пункте 1 имеется ясность относительно двух рассматриваемых языков:

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

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

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

Итак , проф.Редди, могу я перефразировать тебя так :-)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я нашел определение ссылочная прозрачность в книге "Структура и реализация компьютерных программ" (Книга волшебника) полезна, потому что она дополнена объяснением того, как ссылочная прозрачность нарушается путем введения операция присвоения.Посмотрите следующую подборку слайдов, которые я сделал по этому вопросу: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitution-model-of-evaluation-and-violates-referential-transparency-as-explained-in-sicp-the-wizard-book

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