在作为函数式编程语言的方案中,没有赋值语句。但在一份let
声明中
(let ((x 2))
(+ x 3))
你在赋值2
,x
那么为什么这不违反函数式编程中没有赋值语句的原则呢?
在作为函数式编程语言的方案中,没有赋值语句。但在一份let
声明中
(let ((x 2))
(+ x 3))
你在赋值2
,x
那么为什么这不违反函数式编程中没有赋值语句的原则呢?
“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
)和真赋值(withset!
)都可以用于所有变量,并且提供了专门的原语用于列表、向量、字符串等内部的破坏性更新。
http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment
基本上,这是一个允许的单一分配。由于副作用,其他分配不是“允许的”。
编辑:允许引用,因为正如奥斯卡所说,这不是强制性的,而是建议的。