什么是纯函数?

14

我发现了这个引用:

  1. 让预测成为纯函数。

谓词纯度:谓词是一个返回yes/no答案的函数对象,通常作为布尔值返回。在数学意义上,如果函数的结果只取决于其参数,则函数是纯的(请注意,“纯”一词与纯虚函数无关)。

不要允许谓词持有或访问影响其operator()结果的状态,包括成员和全局状态。对于谓词,最好将operator()设置为const成员函数(请参见Item 15)。

在这个语句中提到的纯函数是什么,可以举例说明吗?先谢谢了。


5
这句话提供了一个定义,所以不太清楚你觉得哪部分令人困惑? - NPE
3个回答

20

这是一个纯函数:

int foo(int n)
{
  return n*2;
}

调用它的结果仅取决于其参数。

这不是一个纯函数:

int i = 42;

int bar(int n)
{
  ++i;
  return n*i;
}

返回值取决于除参数之外的其他事情。


2
最简单的放置函数无疑是一个空操作 int f(int n) { return n; } - Ed Heal
@EdHeal 或者只需 return 42; - juanchopanza

9

如果一个函数满足以下条件,则称之为纯函数:

  1. 没有语义上可观察到的副作用
  2. 对于相同的输入,始终返回相同的结果

因此,该函数仍然可以拥有状态,但是状态不应该是可观察到的。例如:

int foo(std::vector<int> v) {

  static std::vector<int> tmp;
  tmp.resize(v.size);

  std::transform(v.begin(), v.end(), tmp.begin(), [](int a) {return a * a;});
  return std::accumulate(tmp.begin(), tmp.end(), 0);
}

函数foo具有状态(静态向量),但它是非语义可观察的,因此它是纯函数。虽然这是一个愚蠢的函数,但它应该可以说明问题。


0
纯函数没有副作用,始终返回仅由其输入值确定的结果,并且对于相同的输入值,返回值始终相同。
它们非常容易进行测试。
纯函数的例子可以是 Redux 中的 reducer(理想情况下它们应该是纯函数)。副作用的例子包括 HTTP 请求。
以下是一个纯函数的代码示例:
int multiplyByTwo(int n)
{
  return n * 2;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接