c++ 什么是纯函数?

wsewodh2  于 2023-07-01  发布在  其他
关注(0)|答案(3)|浏览(228)

我发现这句话:

  1. Make预测纯函数。
  • 同品种纯度: predicate 是一个函数对象,它返回一个是/否的答案,通常是一个bool值。如果一个函数的结果只依赖于它的参数,那么这个函数在数学意义上是纯的(注意,“纯”的使用与纯虚函数无关)。
  • 不允许 predicate 持有或访问影响其operator()结果的状态,包括成员状态和全局状态。更倾向于将operator()作为 predicate 的const成员函数(见第15项)。*

什么是纯函数在这个声明中,有人能提供例子吗?先谢谢你。

sczxawaw

sczxawaw1#

这是一个纯函数:

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

调用它的结果只取决于它的参数。
这不是一个纯函数:

int i = 42;

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

返回的值取决于参数以外的东西。

3duebb1j

3duebb1j2#

函数是纯函数,如果:
1.它没有语义上可观察到的副作用
1.对于相同的输入,始终返回相同的结果
所以函数仍然可以有一个状态,但它不应该是可观察的。例如:

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有一个状态(静态向量),但是它在语义上是不可观察的,因此它是纯的。这是一个愚蠢的功能,但它应该表明这一点。

axkjgtzd

axkjgtzd3#

纯函数没有副作用,总是返回一个仅由其输入值确定的结果,并且对于相同的输入值,返回值总是相同的。
它们非常容易测试。
纯函数的一个例子是Redux中的reducer(理想情况下,它们应该是纯函数)。副作用的示例是例如http请求。
下面是一个纯函数的代码示例:

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

相关问题