3

请注意:通过“纯”功能,我不是指“纯虚拟”
,我指的是这个

如果一个函数“读取”了一些全局状态,这会自动使它变得不纯吗?还是取决于其他因素?

如果它自动使其不纯,请解释原因。

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

4

4 回答 4

9

“纯”函数是其结果取决于其输入参数的函数。如果它读取任何其他内容,则它不是纯函数。

于 2009-03-04T05:44:13.997 回答
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];
}

在这种情况下,只要没有其他函数接触 global cache,它仍然是数学上的纯函数,即使它在技术上依赖于外部全局状态。然而,这种状态只是一种性能优化——没有它它仍然会执行相同的计算,只是速度更慢。

于 2009-03-04T05:56:35.887 回答
0

纯函数是构造纯表达式所必需的。常量表达式在定义上是纯粹的。

所以,如果你的全局“状态”没有改变,你就可以了。

另请参阅参考透明度

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

于 2009-03-04T05:48:21.803 回答
0

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

于 2009-03-04T06:55:06.993 回答