在函数式程序设计语言scheme中,没有赋值语句。但是在let语句中
(let ((x 2))
(+ x 3))您将2赋值给x,那么为什么这不违反函数式编程中没有赋值语句的原则呢?
发布于 2013-02-19 03:18:24
"Scheme is a functional programming language“这句话是错误的。在Scheme中,鼓励函数式编程风格,但不是强制的。实际上,您可以使用set! (一个赋值语句!)用于修改任何变量的值:
(define x 10)
(set! x (+ x 3))
x
=> 13关于问题的let语句,请记住下面这样的表达式:
(let ((x 10))
(+ x 3))
=> 13..。它只是语法上的糖,在引擎盖下它是这样实现的:
((lambda (x)
(+ x 3))
10)
=> 13请注意,let对其变量执行一次性single assignments,因此它本身不违反任何纯粹的函数式编程原则,以下是let表达式可以肯定的:
如果表达式的求值不改变机器的可观察状态,并且为相同的输入生成相同的值,则表达式的求值不会产生副作用
另外,引用维基百科的话:
不纯函数式语言提供单一赋值和真实赋值(尽管真实赋值的使用频率通常低于命令式编程语言)。例如,在Scheme中,单个赋值(使用
let)和真实赋值(使用set!)都可以在所有变量上使用,并且提供了专门的原语,用于列表、向量、字符串等内部的破坏性更新。
发布于 2013-02-19 03:18:18
http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment
基本上,这是一个允许的单一赋值。由于副作用,其他赋值是不允许的。
编辑:允许引用,因为正如Oscar所说,这不是强制性的,而是建议的。
https://stackoverflow.com/questions/14943681
复制相似问题