具有类型函数的非纯参数的函数是纯粹的吗?

时间:2016-02-08 10:22:51

标签: functional-programming purely-functional

将非纯函数作为参数的函数如果不直接更改/存储状态,不引用全局变量等,可以认为是纯函数吗? 我们在哪里以及如何绘制关于纯粹和什么不是什么的界限,是仅仅依赖于函数的问题代码还是我们考虑了调用参数的效果?

E.g。想象一下这种情况,其中pure函数表示无状态工作流,并将在此工作流期间执行的一些操作作为参数。其中一个动作会改变一些状态。因此,如果我严格看待我的工作流程的实现,它看起来很纯粹,但最终它通过调用修改状态的这个参数函数来修改状态。 我很想推测工作流程也是非纯粹的,但传递一个不会改变状态的不同参数会让它变得纯粹,所以我很困惑。

任何帮助将不胜感激。谢谢。

1 个答案:

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

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