Какая терминология функционального программирования различает изменяющие переменные объекты и объекты? - PullRequest
0 голосов
/ 28 марта 2011

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

Для пример , в Ruby,

name += title

избегает изменения объекта, на который ранее ссылается name, вместо этого создает новый объект, но, к сожалению, name обращается к новому объекту, тогда как

full_title = name + title

не только избегает измененияобъекты, он избегает изменения того, к чему относится name.

Какую терминологию вы бы использовали для кода, который избегает первого?

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Я думаю, что в функциональных языках программирования просто нет операторов, которые деструктивно обновляют один из исходных операндов (возможно, это деструктивное обновление - термин, который вы ищете?). Аналогичная философия проявляется в дизайне набора команд: философия RISC (все более широко используемая в даже в архитектуре x86 , в более новых расширениях) состоит в том, чтобы иметь трехоперандные инструкции для бинарных операторов, где необходимо явно указать что целевой операнд совпадает с одним из источников, если вы хотите деструктивное обновление.

В последнем случае некоторые гибридные языки (например, Scala ; в X10 используются те же терминологии) различают значения (val) и переменные (var). Первое не может быть переназначено, второе может. Если они указывают на изменяемый объект, то, конечно, сам этот объект все еще можно изменить.

1 голос
/ 28 марта 2011

Использование имени для ссылки на что-то иное, чем то, что оно делало во вложенной / предыдущей области, известно как «скрытие» этого имени. Это действительно отличается от мутации. В Хаскеле, например, я могу написать

return 1 >>= \x -> return (x + 1) >>= \x -> print x.

x, который напечатан, является введенным второй лямбдой, то есть 2.

В нотации do это выглядит немного более знакомым:

foo = do
  x <- return 1
  x <- return (x + 1)
  print x

Насколько я понимаю, Эрланг вообще запрещает псевдонимы.

Тем не менее, я подозреваю, что mathepic является правильным с точки зрения Ruby - он не просто скрывает имя, но изменяет какой-то основной объект. С другой стороны, я не очень хорошо знаю Руби ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...