3

如果函数不直接更改/存储状态、不引用全局变量等,那么将非纯函数作为参数的函数是否可以被视为纯函数?我们在哪里以及如何在什么是纯的和什么不是纯的之间划清界限,是仅仅在函数的问题代码上还是我们考虑到调用参数的影响?

例如,想象一下这种情况,其中纯函数表示无状态工作流,并将在此工作流期间要执行的一些操作作为参数。其中一项操作会在某处更改某些状态。因此,如果我严格查看我的工作流程的实现,它看起来很纯粹,但最终它确实通过调用这个修改状态的参数函数来修改状态。我很想推测工作流也不是纯的,但是传入一个不改变状态的不同参数会使它变得纯,所以我很困惑。

任何帮助都感激不尽。谢谢你。

4

1 回答 1

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)))

不是纯函数,因为它使用非纯效应,即随机性。纯函数总是为相同的参数返回相同的结果。

于 2016-02-08T10:31:50.980 回答