函数式编程中的副作用(racket)
side-effects in functional programming (racket)
我想更好地理解像 Racket 这样的函数式语言的副作用。
- Racket 不是纯函数式语言,对吧?在书中它将副作用定义为:
if it influences subsequent computation (and ultimately program output) in any way other than by returning a value for use in the surrounding context.
根据定义,我认为define
、set!
或displayln
应该是副作用。那么let
呢?
- 区分副作用的最简单方法是什么..
有多种可能的定义,但一个常见且有启发性的定义是,副作用是使 评估顺序 可观察到的任何事物。也就是说,一个程序是 纯 (没有副作用),如果你可以简化它的任何子表达式,以任何顺序,仅仅通过替换定义,而不改变程序的结果。特别是,您始终可以用其定义替换变量,而无需先对其进行评估。
这意味着 I/O,可变状态和异常是副作用,正如人们所期望的那样。严格来说,它甚至暗示非终止是一种效果——虽然一开始这听起来很奇怪,但这正是您在依赖类型语言的情况下想要的,例如。
我想更好地理解像 Racket 这样的函数式语言的副作用。
- Racket 不是纯函数式语言,对吧?在书中它将副作用定义为:
if it influences subsequent computation (and ultimately program output) in any way other than by returning a value for use in the surrounding context.
根据定义,我认为define
、set!
或displayln
应该是副作用。那么let
呢?
- 区分副作用的最简单方法是什么..
有多种可能的定义,但一个常见且有启发性的定义是,副作用是使 评估顺序 可观察到的任何事物。也就是说,一个程序是 纯 (没有副作用),如果你可以简化它的任何子表达式,以任何顺序,仅仅通过替换定义,而不改变程序的结果。特别是,您始终可以用其定义替换变量,而无需先对其进行评估。
这意味着 I/O,可变状态和异常是副作用,正如人们所期望的那样。严格来说,它甚至暗示非终止是一种效果——虽然一开始这听起来很奇怪,但这正是您在依赖类型语言的情况下想要的,例如。