【问题标题】:Functional programming side effects clarification函数式编程副作用澄清
【发布时间】:2017-05-04 16:44:51
【问题描述】:

我目前正在尝试了解有关函数式编程的一般副作用,确切地说是球拍。据我了解,它与更改某些变量的状态有关,例如全局变量。

这是我写的一些代码;

; 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 吗?还是我缺少的基本原则,即使用函数式编程时值是无状态的这一事实?

【问题讨论】:

  • 您的代码中的注释有误。你永远不会定义一个函数。

标签: scheme racket


【解决方案1】:

根据您的代码编写方式,您可以将x 视为一个常量——即addX 不会改变 x 绑定。

和(伪代码)一样

constant X = 5

constant addX = X + 1

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

函数式编程需要不可变数据结构。如果您使用来自其他(命令式)语言的概念来处理方案/球拍,您将会遇到困难并且您生成的代码将非常糟糕。

【讨论】:

  • 谢谢一百万。关于副作用并试图将其与上述联系起来,如何解释?
  • 您希望在函数式程序中避免副作用。 Racket 确实有变异函数(列表set!),但在接触它们之前,您需要了解它们的用例。
  • 如果您向我们展示您正在尝试做的事情,我们可以为您提供更多帮助。 (+ 1 x) 在没有上下文的情况下很难说,因为它几乎可以成为任何程序的一部分。
  • 我强烈推荐 SICPThe Little Schemer 这样的东西来快速熟悉一些方案编程技术和模式。
  • 很抱歉没有看到您的额外评论。所以本质上我只是想在代码中理解 Racket 的副作用。而且在 Littel Schemer 中似乎没有任何关于副作用的内容
【解决方案2】:

(+ 1 x) 是一个表达式。在我们已经有(define x 5) 的情况下,这个表达式的结果是6。该值只是...渗透到任何试图评估它的东西。无论我们要求 DrRacket 评估它,还是我们将它分配给其他东西,比如(define addX (+ 1 x)),变化的是表达式正在变成值。

所以,如果你想给一个已经引入的标识符赋值,你需要告诉解释器来做这个赋值。那个表格是set!,比如,

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

【讨论】:

  • 感谢您的回答。是的,我想我现在对正在发生的事情有所了解。干杯!
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多