将非纯函数作为参数的函数如果不直接更改/存储状态,不引用全局变量等,可以认为是纯函数吗? 我们在哪里以及如何绘制关于纯粹和什么不是什么的界限,是仅仅依赖于函数的问题代码还是我们考虑了调用参数的效果?
E.g。想象一下这种情况,其中pure函数表示无状态工作流,并将在此工作流期间执行的一些操作作为参数。其中一个动作会改变一些状态。因此,如果我严格看待我的工作流程的实现,它看起来很纯粹,但最终它通过调用修改状态的这个参数函数来修改状态。 我很想推测工作流程也是非纯粹的,但传递一个不会改变状态的不同参数会让它变得纯粹,所以我很困惑。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:2)
(define (its-not-me launch-rockets)
(lambda ()
(launch-rockets)))
确实是纯粹的。它不会发射火箭,它只是构建将的计算,如果被调用。但是,仅仅构建这样的计算不会产生任何副作用。
(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)))
不是纯函数,因为使用非纯效果,随机性。纯函数总是为相同的参数返回相同的结果。