Является ли Erlang "единственным назначением" отличным от "неизменных ценностей" Haskell?

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

Является ли формулировка "одиночное присвоение" чем-то отличным от "неизменяемых значений"?

Ответы

Ответ 1

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

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

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

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

Изменить: Из wikipedia

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

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

Одиночное задание:

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

Ответ 2

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

"Единственное назначение" означает, что вы не можете повторно привязать переменную с разными значениями, например:

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

echo = forever $ do
    x <- getLine
    putStrLn x

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

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