我想更好地理解像Racket这样的功能语言的副作用。
是否以其他方式影响后续的计算(最终影响程序输出),而不是返回用于周围环境的值。
根据定义,我认为define
,set!
还是displayln
应该副作用。那又如何let
呢?
可能有多种定义,但一个常见且具有启发性的定义是,副作用是可以使评估顺序可见的任何事物。也就是说,如果您可以仅通过替换定义而不更改程序的结果,就可以以任何顺序简化其任何子表达式,那么该程序就是纯净的(无副作用)。特别是,您始终可以用其定义替换变量,而无需先评估该变量。
正如人们所期望的那样,这意味着I / O,可变状态和异常是副作用。严格说来,它甚至暗示着非终止是一种效果-虽然乍一看听起来很奇怪,但例如对于依赖类型的语言,这正是您想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句