【问题标题】:What functional programming terminology distinguishes between avoding modifying variables and objects?什么函数式编程术语区分避免修改变量和对象?
【发布时间】:2011-07-24 02:50:55
【问题描述】:

在函数式编程中,使用什么术语来区分避免修改变量所指的内容和避免修改对象本身?

对于example,在 Ruby 中,

name += title

避免修改之前name引用的对象,而是创建一个新对象,但遗憾的是让name引用了新对象,而

full_title = name + title

不仅避免修改对象,还避免修改name所指的内容。

对于避免前者的代码,您会使用什么术语?

【问题讨论】:

  • 在纯函数式语言中不存在修改变量,所以我怀疑你会在这里得到有用的答案,除了“函数式编程”。我知道name 的底层对象发生了变化,但是如果我们认为它可能实现为指针,那么指针就会发生变化,这就是状态的变化。
  • 在纯函数式编程中,你甚至不能做前者。在不纯的 FP 中,赋值和定义/绑定通常在语法上是不同的。

标签: functional-programming terminology


【解决方案1】:

使用名称来引用它在封闭/先前范围内所做的事情以外的其他内容称为“隐藏”该名称。它确实不同于突变。例如,在 Haskell 中我可以写

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

打印的 x 是第二个 lambda 引入的,即 2

在 do 表示法中,这看起来有点熟悉:

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

据我了解,Erlang 完全禁止别名。

但是,我怀疑 mathepic 就 Ruby 而言是正确的——它不仅掩盖了名称,而且改变了一些潜在的对象。另一方面,我不太了解 Ruby...

【讨论】:

    【解决方案2】:

    我认为函数式编程语言根本没有任何操作符破坏性更新源操作数之一(破坏性更新,也许,你正在寻找的术语?)。在指令集设计中可以看到类似的理念:RISC 理念(在 even the x86 architecture 中越来越多地使用,在较新的扩展中)是为二元运算符提供三操作数指令,您必须明确指定目标操作数是相同的如果您想要破坏性更新,请作为来源之一。

    对于后者,一些混合语言(如ScalaX10 中使用相同的术语)区分 (val) 和变量 (var)。前者不能重新分配,后者可以。如果它们指向一个可变对象,那么当然该对象本身仍然可以修改。

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 2011-03-25
      • 2013-07-23
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2020-11-03
      • 2018-05-06
      相关资源
      最近更新 更多