在作为函数式编程语言的scheme中,没有赋值语句。
但是在let
陈述中
(let ((x 2))
(+ x 3))
您要将2
分配给x
,为什么这不违反函数式编程中没有赋值语句的原则?
答案 0 :(得分:11)
语句“作为函数式编程语言的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,因此它不违反任何纯函数式编程原理本身,以下内容可以肯定一个let
表达式:
如果表达式的评估没有改变机器的可观察状态,并且为相同的输入生成相同的值,则表达式的评估没有副作用
另外,引自维基百科:
不纯的函数式语言既提供单一赋值也提供真正的赋值(尽管真正的赋值通常使用频率低于命令式编程语言)。例如,在Scheme中,单个赋值(带
let
)和真赋值(带set!
)都可用于所有变量,并提供专用原语用于列表,向量,字符串内的破坏性更新,等
答案 1 :(得分:1)
http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment
基本上,这是一个允许的单一作业。由于副作用,其他任务不是“允许的”。
编辑:允许报价,因为正如奥斯卡所说,这不是强制性的,而是建议的。