我想更好地理解像Racket这样的功能语言中的副作用。
如果它以任何方式影响后续计算(以及最终的程序输出),而不是通过返回在周围环境中使用的值。
根据定义,我认为define
,set!
或displayln
应该是副作用。那么let
呢?
答案 0 :(得分:3)
有各种可能的定义,但一个常见且具有启发性的定义是副作用是使评估顺序可观察的任何内容。也就是说,如果您可以按任何顺序简化任何子表达式,只需替换定义,而不改变程序的结果,那么程序就是纯(没有副作用)。特别是,您始终可以使用其定义替换变量,而无需先对其进行评估。
这意味着I / O,可变状态和异常是副作用,正如人们所期望的那样。严格地说,它甚至暗示非终止是一种影响 - 虽然起初可能听起来很奇怪,但正如你所希望的那样,例如依赖于类型的语言。