纯函数可以读取全局状态吗?

时间:2009-03-04 05:41:12

标签: multicore global-state

请注意:通过“纯粹”功能,我的意思并不是“纯虚拟” 我指的是this

如果一个函数“读取”某个全局状态,那么它会自动呈现为不纯吗?还是取决于其他因素?

如果它自动呈现不纯,请解释原因。

如果取决于其他因素,请解释它们是什么。

4 个答案:

答案 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)

  

构造纯表达式需要纯函数。根据定义,常量表达式是纯粹的

所以,如果你的全球“国家”没有改变,你就可以了。

另见referential transparency

  

一个更微妙的例子是使用全局变量(或动态范围的变量或词法闭包)来帮助它计算结果的函数。由于此变量不作为参数传递但可以更改,因此即使参数相同,对函数的后续调用结果也可能不同。 (在纯函数式编程中,不允许进行破坏性赋值;因此使用全局(或动态范围)变量的函数仍然是引用透明的,因为这些变量不能更改。)

答案 3 :(得分:0)

例如,在Haskell中,您可以在不纯的一侧创建无穷无尽的随机数列表,并将该列表传递给纯函数。实现将生成纯函数仅在需要时使用的下一个数字,但该函数仍然是纯粹的。