【发布时间】:2013-02-03 07:39:41
【问题描述】:
在作为函数式编程语言的方案中,没有赋值语句。
但在let 声明中
(let ((x 2))
(+ x 3))
你是把2赋值给x,那为什么不违反函数式编程中没有赋值语句的原则呢?
【问题讨论】:
标签: functional-programming scheme let
在作为函数式编程语言的方案中,没有赋值语句。
但在let 声明中
(let ((x 2))
(+ x 3))
你是把2赋值给x,那为什么不违反函数式编程中没有赋值语句的原则呢?
【问题讨论】:
标签: functional-programming scheme let
“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
注意let 对其变量执行一次single assignments,因此它不违反任何纯函数式编程原则本身,以下可以肯定@987654328 @表达式:
如果表达式的计算不改变机器的可观察状态,并且对相同的输入产生相同的值,则表达式的评估不会产生副作用
另外,引用维基百科:
不纯函数式语言既提供单一赋值也提供真赋值(尽管真赋值的使用频率通常低于命令式编程语言)。例如,在 Scheme 中,单一赋值(
let)和真赋值(set!)都可以用于所有变量,并且提供了专门的原语用于列表、向量、字符串等内部的破坏性更新。
【讨论】:
do 循环),并且根据方言的不同,for 循环结构的种类繁多。我会说这是一组非常完整的命令式功能:)。告诉我您认为缺少的一项功能,我敢打赌我可以为您找到它!
http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment
基本上,这是一个允许的单一分配。由于副作用,其他分配不是“允许的”。
编辑:允许引用,因为正如 Oscar 所说,这不是强制性的,而是建议的。
【讨论】: