功能编程副作用澄清

时间:2017-05-04 16:44:51

标签: scheme racket

我目前正试图了解一般关于功能性编程的副作用,准确地说是球拍。我的理解是它与改变某个变量的状态有关,就像全局变量一样。

这是我编写的一些代码;

; Define a variable with the value of 5
(define x 5)

; Define a function to add 1 to x
(define addX
(+ 1 x))

; Test out values
x
addX
x

哪个输出5 6 5。

最后一个值是不是6?或者是我缺少的基本原则,即在使用函数式编程时该值是无状态的这一事实?

2 个答案:

答案 0 :(得分:2)

编写代码的方式,您可以将x视为常量 - 即addX不会突变 x绑定。

它与(伪代码)

相同
constant X = 5

constant addX = X + 1

print(X)     ; 5
print(addX)  ; 6
print(X)     ; 5

功能编程需要不可变数据结构。如果你使用其他(命令式风格)语言的概念来处理scheme / racket,那么你就会很挣扎,而你生成的代码也会非常糟糕。

答案 1 :(得分:1)

(+ 1 x)是一个表达式。在我们已经(define x 5)的情况下,此表达式的结果为6。这个价值只是......渗透到任何试图评估它的东西。我们是否要求DrRacket对其进行评估,或者我们将其分配给其他内容,例如(define addX (+ 1 x)),正在改变的是表达式正在成为价值。

因此,如果要为已经引入的标识符分配值,则需要告诉解释器执行此分配。该格式为set!,如,

(define addX #f)
addX ; => #f
(set! addX (+ 1 x))
addX ; => 6