我目前正试图了解一般关于功能性编程的副作用,准确地说是球拍。我的理解是它与改变某个变量的状态有关,就像全局变量一样。
这是我编写的一些代码;
; 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?或者是我缺少的基本原则,即在使用函数式编程时该值是无状态的这一事实?
答案 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