具有类型函数的非纯参数的函数可以是纯函数吗?
Can functions with non-pure arguments of type functions be pure?
以非纯函数作为参数的函数如果不change/store直接声明、不引用全局变量等,是否可以被视为纯函数?
我们在哪里以及如何划清纯与非纯的界限,是仅在函数的相关代码上划清界限,还是我们考虑调用参数的影响?
例如想象一下这个场景,其中纯函数代表一个无状态的工作流,并将在此工作流中执行的一些操作作为参数。这些动作之一改变了某处的某些状态。所以如果我严格地看我的工作流的实现,它看起来很纯粹,但最终它确实通过调用这个修改状态的参数函数来修改状态。
我很想推测工作流也是非纯粹的,但传递一个不改变状态的不同参数会使它变得纯粹,所以我很困惑。
任何帮助将不胜感激。谢谢。
(define (its-not-me launch-rockets)
(lambda ()
(launch-rockets)))
确实很纯。它不发射火箭,它只是构建一个 will、if 调用的计算。但是仅仅构建这样的计算不会产生副作用。
(define (it-is-me launch-rockets)
(launch-rockets)
((its-not-me launch-rockets)))
确实发射了火箭,两次。不管是直接的还是间接的,都没有关系。如果它在执行期间引起副作用,它 会在执行期间引起 副作用。
如果我们有
(define (launch-rockets)
(if (prime? (random-integer))
(do-actually-launch-rockets)
(list 'do-nothing)))
没有任何变化。第一个仍然是纯的,构建一个可能导致副作用的计算是不纯的。
甚至
(define (launch-rockets)
(if (prime? (random-integer))
(list 'i-am-only)
(list 'kidding)))
不是纯函数,因为它 使用 非纯函数,即 随机性 。对于相同的参数,纯函数总是 return 相同的结果。
以非纯函数作为参数的函数如果不change/store直接声明、不引用全局变量等,是否可以被视为纯函数? 我们在哪里以及如何划清纯与非纯的界限,是仅在函数的相关代码上划清界限,还是我们考虑调用参数的影响?
例如想象一下这个场景,其中纯函数代表一个无状态的工作流,并将在此工作流中执行的一些操作作为参数。这些动作之一改变了某处的某些状态。所以如果我严格地看我的工作流的实现,它看起来很纯粹,但最终它确实通过调用这个修改状态的参数函数来修改状态。 我很想推测工作流也是非纯粹的,但传递一个不改变状态的不同参数会使它变得纯粹,所以我很困惑。
任何帮助将不胜感激。谢谢。
(define (its-not-me launch-rockets)
(lambda ()
(launch-rockets)))
确实很纯。它不发射火箭,它只是构建一个 will、if 调用的计算。但是仅仅构建这样的计算不会产生副作用。
(define (it-is-me launch-rockets)
(launch-rockets)
((its-not-me launch-rockets)))
确实发射了火箭,两次。不管是直接的还是间接的,都没有关系。如果它在执行期间引起副作用,它 会在执行期间引起 副作用。
如果我们有
(define (launch-rockets)
(if (prime? (random-integer))
(do-actually-launch-rockets)
(list 'do-nothing)))
没有任何变化。第一个仍然是纯的,构建一个可能导致副作用的计算是不纯的。
甚至
(define (launch-rockets)
(if (prime? (random-integer))
(list 'i-am-only)
(list 'kidding)))
不是纯函数,因为它 使用 非纯函数,即 随机性 。对于相同的参数,纯函数总是 return 相同的结果。