【发布时间】:2012-06-24 14:39:27
【问题描述】:
今天我在阅读纯函数,对它的使用感到困惑:
如果函数为同一组输入返回同一组值并且没有任何可观察到的副作用,则称该函数为纯函数。
例如strlen() 是纯函数,rand() 是不纯函数。
__attribute__ ((pure)) int fun(int i)
{
return i*i;
}
int main()
{
int i=10;
printf("%d",fun(i));//outputs 100
return 0;
}
上述程序的行为与没有pure 声明的情况相同。
将函数声明为pure[如果输出没有变化]有什么好处?
【问题讨论】:
-
是的 - 查看生成的程序集。
-
我不认为这个纯度的定义是正确的——例如
printf是合格的(用相同的参数调用它两次会产生相同的返回值),但它不是纯粹的。 -
@tdammers:确实,它缺少
...and no side-effects...部分。 -
@Ben:熵从何而来?我们在这里处理(理论上)确定性机器,获得真正熵的唯一方法是来自外部来源,这意味着副作用。当然,我们可以允许编程语言定义非确定性函数,假装技术副作用不存在,而函数确实是非确定性的;但如果我们这样做了,追踪纯度的大部分实际好处就会丧失。
-
tdammers 是正确的 - 上面给出的 pure 的定义是不正确的。纯意味着输出仅取决于函数的输入;此外,必须没有可观察到的副作用。 “相同输入的相同输出”是对这些要求的非常不准确的总结。 en.wikipedia.org/wiki/Pure_function
标签: c pure-virtual