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

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


person Claudiu    schedule 17.10.2008    source источник
comment
вау, мне интересно, почему внезапный всплеск популярности этого вопроса ...   -  person Claudiu    schedule 01.08.2012
comment
@claudia: я не могу сказать наверняка, но r / haskell стало известно, и многие сочли, что Удай, хотя и весьма точен, высказал некоторую насмешку по отношению к сообществу.   -  person efrey    schedule 01.08.2012
comment
@efrey Насмешка, наверное, и была. Но когда функциональные программисты опровергают императивные языки программирования и функциональные языки с побочными эффектами (такие как Lisp и ML), утверждая, что они не являются ссылочно прозрачными, разве они не принимают насмешку? Не должны ли они, по крайней мере, получить правильные факты, прежде чем сделать это?   -  person Uday Reddy    schedule 01.08.2012
comment
@Claudiu Я публиковал его на Haskell Reddit, а Конал писал об этом в Твиттере. Я нашел обсуждение интересным и подумал, что он заслуживает более широкого обсуждения. Я обратил внимание на насмешку Удая, чтобы стимулировать обсуждение. Я согласен с тем, что мы, FP, иногда можем расслабиться и нуждаться в хорошем продукте - молодец, Удай предоставил его!   -  person chrisdornan    schedule 02.08.2012
comment
@efrey Я думаю, что неизбежно возникнет напряженность между разработчиками FP и сторонниками императивных языков - `` чистые '' функциональные программы в значительной степени по определению непроцедурны, поэтому сторонники FP не могут не оскорбить сторонников процедурного программирования, просто объясняя себя ( наоборот).   -  person chrisdornan    schedule 02.08.2012
comment
@efrey. В самом деле, именно поэтому я решил процитировать Берда и Вадлера (семантики?) В моем втором посте. Знающие люди знают, что популярная концепция ссылочной прозрачности расплывчата и, возможно, бессвязна. Но сообществу программистов это никогда не объяснялось должным образом. Надеюсь, мой текст здесь изменит ситуацию.   -  person Uday Reddy    schedule 02.08.2012
comment
мне очень понравилось определение из вики haskell (wiki.haskell.org/Referential_transparency), и я искал для других источников, результат здесь: pedrorijo.com/blog/fp-concepts   -  person pedrorijo91    schedule 21.02.2017
comment
@ pedrorijo91 Вы читали ответы UdayReddy? Они объясняют, почему обе ваши FP-ссылки ошибочны. «Ценность, о которой говорили ранние семантики, не является результатом оценки или вывода функции или чего-то подобного. Это значение термина ».   -  person philipxy    schedule 12.07.2017


Ответы (15)


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

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

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

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

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

Парламент Шотландии встречается в Эдинбурге.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

person Uday Reddy    schedule 25.03.2012
comment
Отличное объяснение. Я думаю, что расширение ссылочно прозрачного языка и функций можно грубо перевести как все контексты выражений на языке (или все контексты аргументов для функции, соответственно) ссылочно прозрачными по отношению к «очевидному» экстенсиональному понятию равенства. - person Ryan Culpepper; 25.03.2012
comment
Спасибо, но я не считаю, что существует «очевидное» экстенсиональное понятие равенства. Когда я сказал, что столица Шотландии относится к городу Эдинбург, вы не задумывались дважды. Но когда я начал говорить о том, что происходит с 1999 года, вы внезапно осознали, что на это нужно время. Итак, экстенсиональное понятие равенства может быть довольно тонким и формализовано исследователями языков программирования. Людям, которые хотят иметь полное представление об экстенсиональном равенстве, необходимо изучить плоды этого исследования. Это может быть вовсе не «очевидным». - person Uday Reddy; 25.03.2012
comment
Фантастический ответ! Я получил от этого очень много. Мне бы хотелось, чтобы у вас были какие-либо ссылки на историю ссылочной прозрачности в аналитической философии или на историко-аналитическую философию, относящуюся к информатике в целом. - person sclv; 27.07.2012
comment
Фантастика! Приятное облегчение для популярных заблуждений о RT, например, привязка его к функциям. Или определение путем замены выражения его значением (как в Википедии) - как ни странно, поскольку выражения и значения - это разные вещи. Возможно, в одном из случаев, когда люди ошибаются при рассмотрении RT-сущности императивных языков, является предположение, что эти значения являются простыми вещами, такими как числа, а не более сложными вещами, такими как функции из магазина. - person Conal; 27.07.2012
comment
В книге @sclv «Слово и объект» Куайна, цитируемой Стрейчи в его статье, есть глава «Капризы ссылок», посвященная этому вопросу. Многие другие статьи Куайна также посвящены вопросам ссылок. Если вам интересно узнать больше об анализе ссылочной прозрачности, вам, возможно, понравится прочитать Sondergaard and Sestoft: Referential прозрачность, определенность и раскрываемость. - person Uday Reddy; 27.07.2012
comment
@sclv Что касается более широкого влияния аналитической философии на информатику, я должен сказать, что информатика в том виде, в каком мы ее знаем, была основана Годелем, Черчем, Клини и Тьюрингом. Эти люди были логиками и хорошо разбирались в математических и философских аспектах логики, в частности в традициях Пеано, Фреге, Рассела, Уайтхеда, Карнапа и Куайна. Первые пионеры современной информатики знали эти связи. Но быстрый рост компьютерных наук их оборвал. Нам нужно вернуться к ним. - person Uday Reddy; 28.07.2012
comment
@sclv Логика традиционно рассматривается как наука о последствиях. Но я думаю, что это шире. Это наука об информации. Куайн, как мне кажется, был первым, кто высказал более широкий взгляд. Слово и объект - это анализ информационного содержания высказываний на естественном языке. Однако ни философы, ни математики никогда не проявляли активного интереса к вычислениям, что вызывает глубокое недоумение, учитывая, насколько вычисления были центральными для цивилизации и науки с незапамятных времен. Нам нужно найти способы заинтересовать их. - person Uday Reddy; 28.07.2012
comment
@Conal: Мне кажется, что между представлениями Куайна-Стрейчи о ссылочной прозрачности и представлениями современных функциональных программистов действительно существует некоторая слабая связь. Но природа этого соответствия, на мой взгляд, недостаточно ясна, чтобы четко сформулировать его на данном этапе. Я буду продолжать думать об этом. - person Uday Reddy; 29.07.2012
comment
@Conal: Я добавил новый ответ, который усиливает вашу точку зрения. Вероятно, он будет внизу страницы. - person Uday Reddy; 31.07.2012
comment
Можно ли, по мнению Кьюне, использовать фразу «столица Шотландии» в разных значениях: как представление о месте на карте и как представление о столице Шотландии? Таким образом, мы не можем заменить столицу Шотландии Эдинбургом в Эдинбурге, столице Шотландии, потому что Эдинбург (здесь) не передает второе значение. Если так, то я скучаю по связи между мыслями Куайна и словами Стрейчи. Стрейчи сказал о взаимозаменяемости выражений. Фактически он вводит правило: тот же аргумент - то же возвращаемое значение и никаких побочных эффектов, но это не единственный вариант. - person Mergasov; 19.08.2020
comment
ого я такой вафли еще не видел! - person Fred; 29.01.2021

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

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

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;
}

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

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

person Brian R. Bondy    schedule 17.10.2008
comment
Напомним, что можно иметь полностью ссылочно прозрачный объект с ссылочно прозрачными функциями-членами. См. okmij.org/ftp/Scheme/oop-in-fp.txt - person Jonathan Arkell; 17.10.2008
comment
В случае полностью ссылочно прозрачного класса у вас, вероятно, будут все функции-члены статическими. - person Brian R. Bondy; 17.10.2008
comment
Хорошие ссылки! многие люди объединяют объектно-ориентированный подход с императивом. Они ортогональны друг другу. - person Claudiu; 27.04.2009
comment
Речь идет о не ссылочной прозрачности, хотя ее обычно называют таковой. См. Два ответа Удая и комментарии к ним. В частности, то, что вы называете выходом, не является обозначением. Если вы замените plusG 3 любым другим выражением, имеющим такое же значение / обозначение, вы действительно получите программу с тем же значением, поэтому RT действительно сохраняется в императивных языках. Выражение 3 + 10 или 13 не имеет то же значение, что и plusG 3, потому что значение в императивных языках является функцией хранилища (состояния). - person Conal; 01.08.2012
comment
Я только что прочитал статью о побочных эффектах и ​​изменении состояния и интуитивно понял, что это как-то связано с RT. Не могли бы вы добавить к нему примечание? - person Gaurav; 11.02.2015
comment
Проголосовали за то, что я наконец сформулировал истинное определение на примере, который я искал: код. - person Pedro Lourenço; 07.01.2018
comment
@ PedroLourenço Но этот ответ неверен, повторяя распространенное заблуждение, см. (Правильные) ответы и комментарии UdayReddy. Также у Конала. - person philipxy; 01.03.2018
comment
Для меня это больше похоже на разницу между чистыми и нечистыми функциями ... - person Alonso del Arte; 01.03.2021

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

person Draemon    schedule 17.10.2008
comment
Вот почему это сложно в объектно-ориентированном программировании, потому что у объектов есть состояние. - person Kris; 04.05.2014
comment
Итак, правильно ли при описании функций говорить, что ссылочная прозрачность идентична детерминированной? Если нет, в чем разница между этими двумя терминами? - person mwolfe02; 10.06.2016
comment
Это также звучит как определение чистой функции. - person Evgeny A.; 02.01.2019
comment
Чистый означает отсутствие побочных эффектов, и я не думаю, что ссылочная прозрачность делает какие-либо претензии по этому поводу. - person DharmaTurtle; 23.07.2020
comment
@DharmaTurtle Есть ли пример того, что функция является чистой, но не прозрачной по ссылкам? - person C.W.; 10.05.2021
comment
@ mwolfe02 нет, у вас может быть детерминированная функция, которая зависит от чего-то другого, кроме собственных аргументов (например, ввода-вывода файла). Он может быть детерминированным; дает те же результаты для тех же аргументов и содержимого файла, но не прозрачно по ссылкам. Однако, наоборот, ссылочно прозрачная функция по определению является детерминированной. - person Draemon; 15.05.2021
comment
@DharmaTurtle есть много аргументов в пользу точной разницы между этими терминами, но я не думаю, что кто-то предполагает, что у вас может быть чистая функция, которая не является ссылочно прозрачной. Многие возразят, что у вас может быть и обратное - референциально прозрачная функция, которая зависит только от входных данных, но производит побочные эффекты (например, печать на консоль) и, таким образом, не является чистой. Другие утверждают, что это также нарушает ссылочную прозрачность, даже если это не влияет на результат возврата. - person Draemon; 15.05.2021

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

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

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

  • Функциональные программисты, кажется, верят, что эти «ценности» существуют внутри языка программирования, а не за его пределами. В этом они отличаются как от философов, так и от семантиков языков программирования.

  • Похоже, они верят, что эти «ценности» должны быть получены путем оценки.

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

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

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

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

Landin:

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

Стой:

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

Bird and Wadler:

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

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

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

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

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

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

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

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

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

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

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

person Uday Reddy    schedule 31.07.2012
comment
В этих обвинениях, кажется, ничего нет. Если бы референт 3 в Haskell считался «на языке», то каким был бы референт, кроме 3, но 3 == "3" даже не проверяет тип, а тем более выражает предполагаемую путаницу окружающей среды. Нет ничего более безжалостного в обеспечении различия между использованием и упоминанием, чем система типов. Вам удалось найти ошибочное предложение в Википедии. - person applicative; 31.07.2012
comment
Почему L-значения «не имеют прямого представления в синтаксисе языка»? Любопытная вещь, или значение, или номинал - вы не можете ссылаться на это напрямую, а только в фигурных скобках? Это можно сделать в публикации, но не на языке программирования ... Это хорошо? Мы что-то упускаем, если используем язык без этой косвенной ссылки на значения, на которые нельзя ссылаться напрямую? - person applicative; 31.07.2012
comment
Еще раз спасибо, Удай! Я думаю, вы разрешили путаницу между ценностями внутри и за пределами языка. Однако, как демонстрирует аппликативный подход, эти термины также вводят в заблуждение, поскольку значения внутри языка на самом деле не внутри, поскольку они не являются синтаксисом, хотя иногда у них есть синтаксические аналоги (например, 3 вместо 3). Я думаю, что нам нужен лучший термин для этих внутри ценностей, которые вы называете полученными путем оценки, чтобы отличать их от обозначений. - person Conal; 31.07.2012
comment
Обратите внимание, что с data Nat = Z | S Nat класс «сокращенных выражений» изоморфен N. Таким образом, «смешение» сокращенных выражений Nat с числами в N было бы необычно безвредным, даже если, в отличие от Удая Р., на самом деле это происходит только en passant в статьях Википедии. - person applicative; 31.07.2012
comment
Я думаю, стоит подчеркнуть, что смешение этих двух понятий ценности (оценки и обозначения) вводит функциональных программистов в заблуждение в их критике императивных языков, где разрыв между понятиями велик. - person Conal; 31.07.2012
comment
то есть понятие оценки приводит к выводу, что императивные языки не являются RT, а понятие денотации - нет. - person Conal; 31.07.2012
comment
Conal: внутренние значения - это закрытые термины в нормальной форме? то есть наивный функциональный подход почти полностью синтаксический, в то время как наивный императивный подход почти полностью рабочий ... - person sclv; 31.07.2012
comment
Предположение, что «функциональные программисты» отходят от могущественной традиции Фреге, Рассела, Черча, Куайна и т. Д., Ошибочно принимая, например, количество планет, а именно 8, для выражения на предпочитаемом ими языке программирования, конечно, просто тролль. Что удивляет читателя, так это то, что любой мог подумать, что кто угодно мог подумать, что кто угодно мог подумать об этом ... - person applicative; 01.08.2012
comment
аппликативный: Нет, внутренние значения не являются не закрытыми терминами в нормальной форме. Они семантические (значения), а не синтаксические (термины), как я уже упоминал выше, рекомендуя оценки вместо обозначений вместо значений в языке против ... без .... Нет необходимости вводить понятия редукции или нормальных форм. Когда обозначения сложнее оценок, как в императивном программировании. Не 8 против 8, а скорее 8 против императивного обозначения (включая хранилище и недетерминизм). - person Conal; 01.08.2012
comment
@applicative: Почему L-значения не имеют прямого представления в синтаксисе языка? Потому что они в этом не нуждаются. Программист говорит, что мне нужно новое значение L, и система дает ей его. Она называет это «х» и идет дальше. Было бы ужасной идеей иметь константы, представляющие L-значения, потому что они привязывали бы вас к определенным схемам памяти и заставляли бы самостоятельно управлять памятью. Язык программирования высокого уровня призван освободить вас от таких деталей. - person Uday Reddy; 01.08.2012
comment
@sclv Не имеет особого значения, каковы внутренние значения. Дело в том, что функциональные программисты, похоже, хотят, чтобы все значения находились внутри языка. Например, когда они говорят, что x ++ оценивается как 2, но вы не можете заменить x ++ на 2 или другую аналогичную жалобу, они ограничивают свое представление о том, что может быть «x ++». Идея о том, что x ++ может быть абстрактным преобразователем состояния, им не приходит в голову. Если бы это было так, они бы сразу увидели, что «x ++» как преобразователь состояния сильно отличается от 2. Неудивительно, что вы не можете его заменить. - person Uday Reddy; 01.08.2012
comment
@applicative: Вы совершенно правы, что в моем первом ответе термин «концепция» был неудачным. Мне было неудобно использовать его, потому что Куайн весьма недвусмысленно говорил о несогласованности «концепций». Но мой английский не позволяет мне придумать лучший термин. «Сущность», возможно? - person Uday Reddy; 01.08.2012
comment
Как только мы поняли, что операторы императивного языка программирования обозначают частичные функции преобразования состояния, кажется глупым рассматривать столицу Шотландии как обозначающую Эдинбург, а не частичную функцию, которая преобразует даты в города. - person Tom Crockett; 01.08.2012
comment
Мне кажется, что после того, как вы действительно полностью определили денотационную семантику языка, она не может не быть референциально прозрачной. Это похоже на утверждение, что этот термин бесполезен в отношении языков программирования. - person Tom Crockett; 01.08.2012
comment
@conal Меня беспокоит только утверждение, что «функциональные программисты» отходят от древней мудрости, которой нас учили Фреге, ... Куайн. Я считаю это и последующие замечания несправедливостью. Поскольку единственным доказательством этого чрезвычайно серьезного обвинения УР является типичная путаница в использовании / упоминании, которую люди совершают каждые несколько минут в статье в Википедии. - person applicative; 01.08.2012
comment
@petolom да, это было решение, к которому пришел Фреге в 1880-х годах - например, в разделе 47 Grundlagen («Население Берлина ... является функцией времени» - а не «переменным числом») и с тех пор принимается почти всеми. Тема «ссылочной прозрачности», поднятая Куайном, не имеет ничего общего с той темой, которую, как ему нравится, почти все считают полностью закрытой, и это не один из примеров Куайна - это контексты цитат и убеждений. - person applicative; 01.08.2012
comment
@pelotom: Это хорошо сказано. После того, как вы полностью определили денотационную семантику языка, она не может не быть референциально прозрачной. Стрейчи совершенно ясно дал понять, что конкретный способ определения семантики еще в 60-х годах не было ссылочно прозрачным. Как только он нашел ссылочно прозрачную семантику, то есть правильную денотационную семантику, проблема была решена! - person Uday Reddy; 01.08.2012
comment
Таким образом, похоже, что люди имеют обыкновение использовать термин для обозначения чего-то существенно отличного от того, что имели в виду другие люди, когда использовали этот термин в прошлом. На что я говорю: Добро пожаловать в английский язык. - person Daniel Pratt; 01.08.2012
comment
@applicative: Я понимаю, что вы считаете несправедливым, как вы говорите. Но я не понимаю почему. Это не путаница при использовании / упоминании. Если кто-то говорит о замене термина значением, это сразу подразумевает, что само значение является термином. Но ценности, о которых говорят Фреге и т. Д. (Используя их собственную терминологию), не являются терминами. Итак, существует фундаментальное несовпадение типов. Его нельзя возвести в квадрат. Если вы можете решить эту проблему, продолжайте и добавьте свой ответ к исходному вопросу. Вот как работает этот форум! - person Uday Reddy; 01.08.2012
comment
Путаница в использовании / упоминании на жаргоне Куайна - это смешение термина с тем, что он обозначает, так что да, вы обвиняете «функциональных программистов» в систематическом употреблении / упоминании путаницы - и утверждаете, что таким образом они отходят от могущественной традиции. что отличало эти вещи. Это, конечно, собственно традиция человеческого рода, а не особенность [Фреге, ... Куайна]. Но ваши доказательства для «функциональных программистов» потрясающие и кретиновые и т. Д. отход от очевидного - это одна строчка из статьи в Википедии. - person applicative; 01.08.2012
comment
@applicative: это не то, что я обычно имею в виду, говоря о путанице при использовании / упоминании. Но не бери в голову. Итак, вы полагаете, что функциональные программисты знают, что означают термины как обозначения, но предпочитают говорить об этих обозначениях, как если бы они были терминами? Если да, то что, по их мнению, обозначает x ++ в C? В чем должна быть его ценность? И почему они говорят, что не могут заменить x ++ его значением? - person Uday Reddy; 01.08.2012
comment
Не «семантика» референциально непрозрачна или прозрачна, но контексты, в которых появляются выражения, например, контексты цитат, контексты убеждений и т. Д. Куайн хорошо знал, что язык можно реформировать так, чтобы все контексты были ссылочными, и это было desideratum. Его первый пример - отказ от цитирования в пользу или ссылок на ... списки символов (Word and Object, 143). Он говорит о достигнутой таким образом прозрачности в этом тривиальном случае как о преимуществе «орфографии» над «цитатой». Предоставление семантики не влияет на прозрачность или непрозрачность. - person applicative; 01.08.2012
comment
аппликативный: Вы расстроены тем, что Удай приводит только один пример недоразумений по поводу RT? На этой самой странице StackOverflow есть несколько примеров в ответах и ​​комментариях, особенно когда они применяются к императивным языкам. Например, в отличие от концепции референциальной непрозрачности. Это означает обратное. Вызов функции не всегда может приводить к одинаковому результату. Обратите внимание, что вывод не является обозначением, отсюда и ошибочный вывод о том, что RT не работает. Я много раз видел эту путаницу в #haskell IRC. - person Conal; 01.08.2012
comment
@applicative: О слове и объекте, стр. 142, вы обнаружите понятие чисто референциального и, как следствие, признание того, что контекст может быть частично референциальным. В формальном языке с благими намерениями такая частичная референция может быть вытеснена хорошей семантикой, так что тогда все контексты будут казаться референциальными. Это то, что, как я понимаю, сделал Стрейчи. Возможно, вам будет полезно прочитать его статью, если вы действительно заинтересованы в этой теме. - person Uday Reddy; 01.08.2012
comment
Ясно, что для Куайна контексты цитат и убеждений просто непрозрачны, и никакое семантическое теоретизирование или стрейчизирование (mutatis mutandis) никогда не сможет это изменить. В случае цитаты легко изменить язык, и он показывает, как это сделать, вслед за Тарским, используя символ для «конкатенации» (sc. Cons) и имена персонажей. Он считает очевидным, что эта другая форма представления превосходит другие. Конечно, вы можете использовать слова «непрозрачный контекст» по-разному, если хотите, но вы предлагали этого не делать. - person applicative; 01.08.2012
comment
Меня сбивает с толку ваш акцент на x++. Для представления этой «операции» можно использовать различные устройства даже в Haskell. Здесь (hpaste.org/72420) - достаточно тусклый пример с использованием STRef. В нем (++) создан для обозначения единственной определенной «сущности», которая, как сообщает нам ghci, является единственным из бесконечного множества значений типа STRef s Int -> ST s (). «функциональные программисты» изолируют вещи этого типа все время, я не думаю, что «они» думают, что это невозможно, бессвязно; если кто-то так говорит, им следует изучить немного Haskell или еще несколько стандартных библиотек. - person applicative; 01.08.2012
comment
@UdayReddy Я думаю, что ваши знания языков программирования не так хороши, как вы думаете. Переменные имеют первоклассное существование как символы в общем lisp (создание явных l-значений), и я понимаю, что в Perl также можно передавать l-значения как объекты первого класса. - person Marcin; 01.08.2012
comment
@DanielPratt: Думаю, я открыт для терминов, меняющих смысл. Но я хочу, чтобы кто-нибудь четко указал, что изменилось, почему это изменилось, каково отношение к старому значению и каковы последствия нового значения. Также было бы полезно знать, как и когда было внесено изменение. - person Uday Reddy; 01.08.2012
comment
@Marcin. Мне очень жаль, но я не понимаю, о чем вы говорите. Заметьте, что я никогда ничего не говорил о первоклассных ценностях ни в своем ответе, ни в обсуждении. - person Uday Reddy; 01.08.2012
comment
@UdayReddy Я предполагаю, ради аргумента (а также ради того, чтобы не выставлять себя дураком), что вы правы относительно классического определения термина «ссылочная прозрачность». Во-первых, вы сами говорите, что это определение не имеет особого отношения к программированию. (Уточняется) - person Daniel Pratt; 01.08.2012
comment
@UdayReddy Во-вторых, когда функциональные программисты используют термин «ссылочная прозрачность», они могут делать это, игнорируя классическое определение этого термина, но точка, которую они делают, является правильным, не так ли? ? Дело в том, что в некоторых языках (например, Haskell) выражения, которые могут демонстрировать «побочные эффекты» (изменения состояния и т. Д.), Можно легко отличить (по средствам самого языка) от тех, которые не могут. Во всех известных мне основных императивных языках это не так. - person Daniel Pratt; 01.08.2012
comment
@UdayReddy Вы сказали, что было бы ужасной идеей иметь константы, представляющие L-значения, потому что они привязывают вас к определенным схемам памяти и заставляют вас самостоятельно управлять памятью. Это неверно. - person Marcin; 01.08.2012
comment
@DanielPratt: Да, я сказал, что классическое определение не особенно актуально для языков программирования сегодня (поскольку их семантические проблемы были решены в 60-х годах). Но новое определение нигде не было указано, кроме страниц Wikipedia и StackExchange, и они также не ссылаются на какие-либо источники. Как минимум, определение должно появиться в реферируемой публикации, чтобы мы знали, что критерий строгости был пройден, и тогда мы могли отнестись к нему серьезно. - person Uday Reddy; 01.08.2012
comment
@DanielPratt: Если функциональные программисты хотят иметь в виду свободу от побочных эффектов, то почему они называют это ссылочной прозрачностью? Они могут просто назвать это свободой от побочных эффектов, что является совершенно ясной идеей. Никому не нужно будет спрашивать в stackexchange, что означает свобода от побочных эффектов. Где необходимость воровать грандиозные классические термины, которых, кажется, никто не понимает? - person Uday Reddy; 01.08.2012
comment
@Marcin: Наличие L-значений в качестве первоклассных значений не означает, что существуют константы такого типа, не так ли? Если есть такие константы, я был бы признателен за указатели на литературу. - person Uday Reddy; 01.08.2012
comment
@UdayReddy Прежде всего, я даже не считаю себя «функциональным программистом», поэтому любое определение, которое я даю вам для любого термина, связанного с FP, следует воспринимать с некоторой долей скепсиса. Во-вторых, я действительно не хотел говорить, что является определением RT per se, просто наиболее очевидным следствием (во всяком случае для меня) концепции, которую, как мне кажется, другие определили намного лучше, чем я. - person Daniel Pratt; 01.08.2012
comment
@UdayReddy Вы утверждаете разницу без разницы. В чем разница между значением и контекстом? - person Marcin; 01.08.2012
comment
Этот разговор длился слишком долго. На Reddit haskell есть какие-то разговоры, если люди хотят продолжить его там, но SO предназначен для вопросов и ответов, а не для длительных обсуждений: reddit.com/r/haskell/comments/xgq27/ - person sclv; 01.08.2012
comment
@Marcin: Вы имеете в виду в чем разница между значением и константой? Константа - это заранее определенный символ в языке, например 0 для целых чисел. Ценность в смысле Стрейчи - это математическая сущность. Значения типа «целое число» - это целые числа. Значения типа «целое -› целое »- это все функции от целых до целых (см. Некоторые технические детали). L-значения типа, скажем 'var [integer]', - это все абстрактные местоположения, которые могут содержать целые числа. - person Uday Reddy; 01.08.2012
comment
@UdayReddy Итак, у lisp, например, есть константы (символы), которые представляют l-значения, в отличие от вашего предыдущего утверждения. - person Marcin; 01.08.2012
comment
@Marcin Действительно, использование символов в качестве l-значений зависит от механизма динамического связывания Lisp, который безвозвратно нарушает ссылочную прозрачность даже в классическом смысле. Фактически, можно было бы подумать об этом как о символической версии, связанной с компоновкой памяти, как я назвал их ранее. Я все еще не понимаю, о чем вы говорите. - person Uday Reddy; 01.08.2012
comment
@UdayReddy Я хочу сказать, что вы неправильно заявили, что языки программирования не предоставляют l-значения, и неверно заявили, что такая функция требует ручного управления памятью. Вы не можете просто заявить, что все, что, по вашему мнению, происходит, эквивалентно ручному управлению памятью. Кстати, вы думаете, что все шепелявые имеют динамическую область видимости? Common lisp имеет лексическую область видимости (по крайней мере, за исключением специальных переменных). - person Marcin; 02.08.2012
comment
@Marcin Если бы в Common Lisp, который я не использовал, есть способ объединения статической области видимости с символическими l-значениями, тогда эти символы не были бы константами, не так ли? Каждая область видимости может иметь символ, называемый x, и каждый из них может иметь связанное l-значение. Итак, x не будет обозначать фиксированное l-значение. - person Uday Reddy; 02.08.2012
comment
@Marcin Но я думаю, что вы слишком сосредоточены на своей конкретной проблеме и, возможно, упустили общую картину спора. Моя первоначальная точка зрения заключалась в том, что вы можете иметь значения, которые не представлены как константы в языке программирования, и я привел l-значения в качестве примера. Чтобы проиллюстрировать мою точку зрения, мне нужен только один язык, в котором l-значения не имеют констант. Мне не нужно доказывать, что в каждом языке нет l-значений в качестве констант. Очевидно, что машинные языки имеют константы с l-значением. Мы все это знаем! - person Uday Reddy; 02.08.2012
comment
@UdayReddy Учитывая, что вы решили переопределить все, чтобы оно значило именно то, что вы хотите, я не вижу смысла в дальнейшем обсуждении с вами. В целом, вы пролили очень мало света на эти вопросы и обратили внимание, настаивая на определениях, разработанных для другой цели. - person Marcin; 02.08.2012
comment
Понятия не имею, почему все продолжают голосовать за сообщения этого парня. Я оставил эту страницу с 15 минутами потраченного впустую времени, читая какого-то парня, который изрыгает определения и пишет эссе, и его единственной поддержкой было обращение к власти (его так называемые возвышающиеся гиганты). Насколько нам известно, он может быть прав. Но по большей части его комментарии неконструктивны для этой дискуссии и вращаются исключительно вокруг определений, которые были придуманы для другой области. Вместо использования определений, применимых к обсуждаемой области. Иронично, учитывая, как он продолжал и продолжал о контексте в своем первоначальном посте. - person Zoran Pavlovic; 25.02.2013
comment
Вот источник для общего использования. Бертран Мейер, Введение в теорию языков программирования (1990) с. 7: Ссылочная прозрачность… - это свойство, присущее математической нотации, подстановки равных вместо равных: оно имеет место, если всякий раз, когда a = b, любое свойство, полученное из истинного свойства заменой b для a по-прежнему верно. … Языки программирования… нарушают ссылочную прозрачность, если допускают побочные эффекты. - person Ben Kovitz; 02.04.2014
comment
@BenKovitz. Спасибо. Я не знал, что к вечеринке присоединился Бертран Мейер. К сожалению, обсуждение на стр.7 не объясняет общепринятого использования. Скорее, это обычное заблуждение. Используемое им определение ссылочной прозрачности является стандартным. Но его применение неверно. Он говорит, что f (z) = 1 в том смысле, что вызов f (z) вернет значение 1, где в том смысле, что это ласковые слова. Ни один здравомыслящий программист на земле не согласится с тем, что выражения f (z) и 1 равны. Поскольку они не равны, его определение ссылочной прозрачности неприменимо. - person Uday Reddy; 02.04.2014
comment
Я все еще немного запутался. Действительно ли императивный язык предполагает, что ценности в основном являются истиной вселенной. Поэтому язык просто пытается указать на эту истину. И если у вас может быть несколько способов ссылаться на эту истину, каждый из которых является прозрачно ссылочным? Или он говорит, что, учитывая все входные данные методов, даже те, которые получены с помощью подвыражений, выходные данные будут такими же и ссылочно прозрачными? Последнее, казалось бы, было просто вопросом спора о том, что является реальным вкладом. - person Didier A.; 13.10.2015
comment
@didibus Да, в вашей терминологии ценности или, скорее, обозначения являются истиной вселенной. Язык является ссылочно прозрачным, если два фрагмента программы, представляющие одно и то же обозначение (и, следовательно, эквивалентные), могут быть заменены друг на друга, не влияя ни на что другое. Ссылочно прозрачны не фрагменты программы. Ссылочная прозрачность - это свойство всего языка, которое позволяет нам заменять эквивалентные фрагменты друг на друга. - person Uday Reddy; 22.10.2015

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

person Christian C. Salvadó    schedule 17.10.2008

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

person Barry Kelly    schedule 17.10.2008

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

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

f x = x + x,

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

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

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

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

person chrisdornan    schedule 27.07.2012
comment
У меня нет проблем с языками, облегчающими рассуждение по уравнениям. Но я бы сказал, что это имеет какое-то отношение к ссылочной прозрачности в классическом понимании. Во-вторых, как практический программист я считаю, что логические рассуждения переоценены. Рассуждения, которые важны на практике, связаны с предварительными условиями, постусловиями, инвариантами и абстракцией данных. Для людей, которые полагаются на такие методы рассуждения, побочные эффекты не имеют большого значения. Итак, хотя я согласен с вами в том, что побочные эффекты в выражениях - плохая идея, они, похоже, не представляют собой убедительного аргумента. - person Uday Reddy; 31.07.2012
comment
@UdayReddy, ваше первоначальное обсуждение классической RT, похоже, сводилось к рассуждениям по уравнениям, другими словами, отвечая на вопрос: «Какие изменения я могу внести в это предложение или фразу, сохранив при этом ее смысл». Например, могу ли я заменить в этой фразе столицу Шотландии Эдинбургом и сохранить ее значение. Это имеет смысл для логика, поскольку мы часто пытаемся понять вещи, видя, как они меняются или не претерпевают трансформации; если вы пытаетесь в чем-то формально разобраться, у этого есть очевидные преимущества. - person chrisdornan; 31.07.2012
comment
@UdayReddy Я думаю, что некоторая путаница вокруг RT проистекает из большого внимания, которое функциональные программисты уделяют ссылочной прозрачности, игнорируя при этом другие области информатики, в результате чего многие предположения FP «просочились» в понимание RT большинством людей. Споры вокруг вашего первоначального ответа подчеркнули это для меня. - person chrisdornan; 31.07.2012
comment
@UdayReddy Тем не менее, я не принимаю ваш основной тезис, который пахнет чрезмерным увлечением. - person chrisdornan; 31.07.2012
comment
@UdayReddy Просто потому, что функциональные программисты выбрали определенный метод набора ссылочной прозрачности в своих программах (устранение побочных эффектов и разработка сложной и мощной алгебры программ), или имеют некоторых практиков, которые, вероятно, не понимают ссылочную прозрачность, а также они думают, что это так, не означает, что функциональные языки программирования не могут повысить ссылочную прозрачность или что программисты функциональных языков и составители компиляторов не используют это увеличение формальной управляемости для многих хороших целей. - person chrisdornan; 31.07.2012
comment
@UdayReddy Далее, если эквациональные рассуждения принимаются как допустимое средство достижения ссылочной прозрачности (а мне еще предстоит понять, почему это не так), то, конечно, монадический метод выражения ввода-вывода в Haskell является полностью последовательным методом выражения аффективные программы без ущерба для RT. Все обычные преобразования, доступные для «чистого» кода, можно точно так же применять и к чистому коду; программисты (могут) и инструменты (действительно) активно используют этот факт. - person chrisdornan; 31.07.2012
comment
Крис: Удай указал, что Стрейчи устранил проблему ссылочной непрозрачности в семантике языков программирования, особенно для императивных языков. Поэтому функциональные программисты не могут добиться ссылочной прозрачности в своих программах. В качестве конкретного примера, Haskell IO не помогает с RT именно потому, что не требуется помощи RT. - person Conal; 01.08.2012
comment
@chrisdornan: Извините за мой первый комментарий выше. Мне самому было трудно понять, что я пытался сказать в первых двух предложениях :-( Но вот объяснение. Рассмотрим двухуровневое или многоуровневое исчисление стадий. Каждый оператор постановки референциально непрозрачен. На самом деле это , оператор цитирования.Однако на каждом этапе вы можете идеально выполнять уравнительные рассуждения. Таким образом, каждый референциально непрозрачный оператор устанавливает границы для эквациональных рассуждений. - person Uday Reddy; 01.08.2012
comment
@chrisdomain: Более того, очень немногие люди захотят быть сторонниками ссылочной прозрачности, чтобы изгнать таких операторов постановки. Эти операторы чрезвычайно полезны. Программирование без них, выполняя постановку вручную, было бы утомительно, чревато ошибками и некрасиво. И выполнение постановки вручную не принесет вам большего количества рассуждений по уравнениям, чем то, что у вас было раньше. Итак, запрещение хороших программных устройств в пуристическом стремлении к эквациональному рассуждению было бы равносильно отрезанию носа назло своему лицу. - person Uday Reddy; 01.08.2012
comment
@chrisdomain: С другой стороны, я полностью согласен с вами, что использование выражений с побочными эффектами, таких как x ++, является ошибочной практикой. То, что вы получаете с точки зрения удобства, тривиально. Но то, что вы теряете с точки зрения эквациональных рассуждений (или даже других форм логических рассуждений), значительно. Если вы когда-нибудь увидите какую-либо из моих статей, вы обнаружите, что я использую императивные языки, в которых выражения не имеют побочных эффектов, такие как идеализированный алгол Рейнольдса. Фактически, выражения только для чтения представляют собой мою любимую исследовательскую задачу. Жалко, что в Haskell таких вещей нет! - person Uday Reddy; 01.08.2012
comment
@Conal Я думаю, вы слишком много требуете. Если бы Стрейчи действительно устранил проблему ссылочной непрозрачности в семантике языков программирования, то каждый язык программирования, для которого мы могли бы написать денотационную семантику (то есть каждый язык программирования), был бы одинаково ссылочно прозрачным, что вызвало бы вопрос. Я не думаю, что Удай говорит это, но соглашается с тем, что некоторые программные конструкции (например, операторы присваивания, встроенные в выражения) уменьшают ссылочную прозрачность программы. (Я уверен, что меня тут быстро исправят, если это будет необходимо.) - person chrisdornan; 01.08.2012
comment
@UdayReddy: было бы полезно, если бы я попытался обрисовать ваш аргумент, который, кажется, таков. Функциональные программисты в некоторой степени колонизировали термин ссылочная прозрачность и придают ему более узкое значение, чем классическое определение, что привело к двум досадным результатам: (i) общая путаница относительно того, что означает «ссылочная прозрачность» (как можно увидеть в статье в Википедии). и, возможно, здесь) и (ii) в той степени, в которой колонизация и неразбериха увенчались успехом, это блокирует другие потенциально интересные способы повышения ссылочной прозрачности программ. - person chrisdornan; 01.08.2012
comment
@UdayReddy У меня такое ощущение, что вы считаете эту путаницу досадной, поскольку (как вы ее видите) функциональные программисты приняли, к сожалению, ограничительную дисциплину, вынуждая их выйти за пределы досягаемости многих полезных программных конструкций, по-видимому, в погоне за слишком узкой концепцией ссылочного прозрачность. - person chrisdornan; 01.08.2012
comment
позвольте нам продолжить это обсуждение в чате - person Uday Reddy; 01.08.2012
comment
@UdayReddy Тем не менее, я думаю, что FPers достигли чего-то весьма примечательного. Я не новичок в этом, сначала изучал Miranda и отслеживал развитие Haskell с самых ранних отчетов (в которых использовался поток и ввод-вывод продолжения). В настоящий момент я пишу динамический планировщик на Haskell для подготовки носителя для медиасервера с целью его распределения по множеству узлов для масштабируемости. Это реальное приложение и моя первая серьезная попытка использовать механизмы параллелизма Haskell. Я поражен тем, насколько легко получить чистый дизайн более или менее из типов. - person chrisdornan; 01.08.2012

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

person Andrew Birkett    schedule 25.02.2010

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

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

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

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

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

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

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

person Anuradha    schedule 02.08.2012
comment
Ха-ха. Спасибо за объяснение. Проблема также в том, что функциональные программисты действуют так, как будто у них есть общее понятие ссылочной прозрачности, применимое ко всем языкам программирования. Но это зависит от их представления о ценности, которое может иметь или не иметь смысла для других языков. Чтобы претендовать на общую теорию ссылочной прозрачности, они должны произвести общую теоретическую ценность. Этого пока нет. - person Uday Reddy; 02.08.2012

Следующий ответ, я надеюсь, дополняет и уточняет противоречивые 1-й и 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 увеличивается, а второй компонент - это самое значение. В этом смысле контекст [·]++ является ссылочно прозрачным, если и только если он удовлетворяет приведенному выше определению.

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

person Community    schedule 29.02.2016
comment
Предположительно 1-й и 3-й ответы - это ответы UdayReddy от 25 марта и постскриптум соответственно. Порядковые номера - не лучший способ ссылаться на ответы в SO. Мало того, что голоса и подтверждения могут меняться с течением времени, так и есть несколько выбираемых порядков. - person philipxy; 01.03.2018

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

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

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

person rdm    schedule 26.07.2012

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

person Philip Schwarz    schedule 09.12.2018

Ссылочную прозрачность можно просто сформулировать как:

  • Выражение, всегда приводящее к одному и тому же результату в любом контексте [1],
  • Функция, если ей дважды заданы одни и те же параметры, должна дважды выдавать один и тот же результат [2].

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

person Can    schedule 13.07.2019

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

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

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

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

Многие языковые функции поддерживают нечистую ссылочную прозрачность, такие как монада ST в Haskell и constexprs и некоторые лямбды в C ++.

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

person Ari Fordsham    schedule 07.12.2020

Когда я прочитал принятый ответ, я подумал, что нахожусь на другой странице, а не в stackoverflow.

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

let counter=0
function count(){
  return count++
}

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

Вот как мы делаем его ссылочно прозрачным:

function count(counter){
       return count+1
   }

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

person Yilmaz    schedule 23.03.2021