方案让声明

时间:2013-02-18 19:15:12

标签: functional-programming scheme let

在作为函数式编程语言的scheme中,没有赋值语句。 但是在let陈述中

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

您要将2分配给x,为什么这不违反函数式编程中没有赋值语句的原则?

2 个答案:

答案 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

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

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