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

如果功能“读取”一些全球状态,是否会自动使其不纯净?还是取决于其他因素?

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

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

有帮助吗?

解决方案

“纯”的function是一个函数,其结果在其输入参数上仅依赖于 。如果它读取任何其他内容,则它不是纯函数。

其他提示

在某些特殊情况下,是的。例如,如果你有一个仅由你的函数读取和写入的已计算值的全局缓存,它仍然是数学上纯的,在某种意义上输出只依赖于输入,但它不是纯粹的从最严格的意义上说。例如:

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 ,它仍然是一个数学上纯函数,即使它在技术上依赖于外部全局状态。但是,这种状态只是一种性能优化 - 如果没有它,它仍会执行相同的计算,只是更慢。

  

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

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

另见参考透明度

  

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top