Отличается ли Erlang "одиночным присваиванием" от Haskell "неизменяемых значений"? - PullRequest
14 голосов
/ 17 марта 2012

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

Означает ли формулировка «одиночное присваивание» нечто отличное от «неизменяемых значений»?

Ответы [ 5 ]

17 голосов
/ 17 марта 2012

В erlang переменная может быть привязана или не связана.Вы можете назначить значение только несвязанной переменной.И вот откуда происходит одно присваивание, потому что как только переменная связана, вы больше не можете присваивать ей новое значение.Таким образом, в erlang вы не можете сделать следующее, даже если 0 и 1 являются неизменяемыми значениями.

X = 1.
X = 2. // This is not a valid operation

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

X = immutableValue;
X = anotherImutableValue; // This is a valid operation

Редактировать: Из Википедии

Неизменяемый объект :

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

Single Assignment :

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

7 голосов
/ 17 марта 2012

Разница связана с разницей между (повторным) связыванием переменной и изменением значения.

«Одно назначение» означает, что вы не можете повторно связать переменную с другими значениями, например:

1> A = 1.
2> A = 2.
** exception error: no match of right hand side value 2

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

4 голосов
/ 19 марта 2012

Я вообще не знаю Эрланга, поэтому, возможно, не смогу дать лучший ответ.

В Haskell вы не пишете программу как последовательность шагов, которые нужно оценить.Вместо этого вы определяете набор уравнений.Следовательно, понятие «назначение» не подходит.Когда я пишу x = 1 в Haskell, это не директива для привязки имени x к значению 1, это объявление, что x равно 1.

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

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

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

Учитывая, что небольшое количество поисков в Google указывает мне, что переменные могут снова быть несвязанными в Erlang, я бы сказал, что это совершенно разные понятия.

3 голосов
/ 18 марта 2012

Ну, Хаскель ссылочно прозрачен. Это означает, что «переменная» является переменной в математическом смысле. Единственное понятие «присвоение переменной» не имеет смысла в Haskell, потому что нет семантической разницы между именем и значением, которое оно обозначает. Другими словами, знак равенства (=) действительно вводит уравнение.

В этой концепции, естественно, каждое значение является неизменным, и когда вы определяете x = 3, то между x и 3 нет никакой разницы. Как гласит уравнение, это одно и то же.

3 голосов
/ 17 марта 2012

Программист на Haskell сообщает. Да, «одиночное присваивание» и «неизменяемые значения» - это одно и то же.Haskell принимает эту концепцию немного глубже: ценность всего определяется во время компиляции.Да, все.

Вы можете спросить, как это возможно, поскольку Haskell может четко выполнять ввод / вывод.Ответ заключается в том, что когда вы определяете операцию, которая извлекает входные данные из внешнего мира, вы определяете не значение, а просто операцию, которая его извлекает.Вы никогда не определяете явно значение, которое связано.В Haskell, когда вы делаете что-то вроде:

echo = forever $ do
    x <- getLine
    putStrLn x

Вы не «определяете» x, а просто просто говорите getLine и putStrLn, как взаимодействовать.Единственное, что вы на самом деле определяете - это echo, что является не более чем действием, ожидающим запуска.Ясно, что поведение echo определяется во время компиляции, тогда как значение x не равно.

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

...