请注意:通过“纯粹”功能,我的意思并不是“纯虚拟” 我指的是this
如果一个函数“读取”某个全局状态,那么它会自动呈现为不纯吗?还是取决于其他因素?
如果它自动呈现不纯,请解释原因。
如果取决于其他因素,请解释它们是什么。
答案 0 :(得分:7)
“纯”函数是一个函数,其结果在其输入参数上仅依赖于 。如果它读取任何其他内容,则它不是纯函数。
答案 1 :(得分:3)
在某些特殊情况下,是的。例如,如果你有一个仅由你的函数读取和写入的已计算值的全局缓存,它仍然是数学上纯的,在某种意义上输出只依赖于输入,但它不是纯粹的从最严格的意义上说。例如:
static int cache[256] = {0};
int compute_something(uint8_t input)
{
if(cache[input] == 0)
cache[input] = (perform expensive computation on input that won't return 0);
return cache[input];
}
在这种情况下,只要没有其他函数接触全局cache
,它仍然是数学上纯函数,即使它在技术上依赖于外部全局状态。但是,这种状态只是一种性能优化 - 如果没有它,它仍会执行相同的计算,只是更慢。
答案 2 :(得分:0)
构造纯表达式需要纯函数。根据定义,常量表达式是纯粹的
所以,如果你的全球“国家”没有改变,你就可以了。
一个更微妙的例子是使用全局变量(或动态范围的变量或词法闭包)来帮助它计算结果的函数。由于此变量不作为参数传递但可以更改,因此即使参数相同,对函数的后续调用结果也可能不同。 (在纯函数式编程中,不允许进行破坏性赋值;因此使用全局(或动态范围)变量的函数仍然是引用透明的,因为这些变量不能更改。)
答案 3 :(得分:0)
例如,在Haskell中,您可以在不纯的一侧创建无穷无尽的随机数列表,并将该列表传递给纯函数。实现将生成纯函数仅在需要时使用的下一个数字,但该函数仍然是纯粹的。