10

在作为函数式编程语言的方案中,没有赋值语句。但在一份let声明中

(let ((x 2))
    (+ x 3))

你在赋值2x那么为什么这不违反函数式编程中没有赋值语句的原则呢?

4

2 回答 2

16

“Scheme 是一种函数式编程语言”这句话是不正确的。在 Scheme 中,函数式编程风格是被鼓励的,但不是强制的。事实上,您可以使用set!(赋值语句!)来修改任何变量的值:

(define x 10)
(set! x (+ x 3))
x
=> 13

关于let问题的陈述,请记住这样的表达:

(let ((x 10))
  (+ x 3))
=> 13

...它只是语法糖,在引擎盖下它是这样实现的:

((lambda (x)
   (+ x 3))
 10)
=> 13

请注意, a对其变量let执行一次性单一赋值,因此它本身并不违反任何纯函数式编程原则,可以肯定以下let表达式:

如果表达式的评估不改变机器的可观察状态,并且对相同的输入产生相同的值,则表达式的评估不会产生副作用

另外,引用维基百科:

不纯函数式语言既提供单一赋值也提供真赋值(尽管真赋值的使用频率通常低于命令式编程语言)。例如,在 Scheme 中,单个赋值(with let)和真赋值(with set!)都可以用于所有变量,并且提供了专门的原语用于列表、向量、字符串等内部的破坏性更新。

于 2013-02-18T19:18:23.990 回答
1

http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment

基本上,这是一个允许的单一分配。由于副作用,其他分配不是“允许的”。

编辑:允许引用,因为正如奥斯卡所说,这不是强制性的,而是建议的。

于 2013-02-18T19:18:17.947 回答