纯函数

来源:互联网 发布:数据挖掘会议 2017 编辑:程序博客网 时间:2024/04/28 14:01

原文:http://blog.csdn.net/hongweigg/article/details/44035283

英文:https://en.wikipedia.org/wiki/Pure_function

在计算机编程中,假如满足下面这两个句子的约束,一个函数可能被描述为一个纯函数:

  1. 给出同样的参数值,该函数总是求出同样的结果。该函数结果值不依赖任何隐藏信息或程序执行处理可能改变的状态或在程序的两个不同的执行,也不能依赖来自I/O装置的任何外部的输入(通常是这样的--看下面的描述)。
  2. 结果的求值不会促使任何可语义上可观察的副作用或输出,例如易变对象的变化或输出到I/O装置。


      该结果值不需要依赖所有(或任何)参数值。然而,必须不依赖参数值以外的东西。函数可能返回多重结果值,并且对于被认为是纯函数的函数,这些条件必须应用到所有返回值。假如一个参数通过引用调用,任何内部参数变化将改变函数外部的输入参数值,它将使函数变为非纯函数。

例如:
纯函数

  • sin(x),返回实数x的sin值
  • length(s),返回串s的大小
  • encrypt(k,d),运行一个使用key k 关于日期片d的确定加密算法


非纯函数

  • 返回当前天星期几的函数是一个非纯函数,因为在不同的时间它将产生不同的结果,它引用了一些全局状态。同样地,任何使用全局状态或静态变量潜在地是非纯函数。
  • random()是非纯函数,因为每次调用潜在地产生不同的值。这是因为伪随机数产生器使用和更新了一个全局的“种子”状态。加入我们修改它去拿种子作为参数,例如random(seed),那么random变为纯函数,因为使用同一种子值的多次调用返回同一随机数。
  • printf() 是非纯函数,因为它促使输出到一个I/O装置,产生了副作用。
1 0