Является ли 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.