【发布时间】:2009-10-22 18:59:41
【问题描述】:
我昨天参加了 StackOverflow 开发日大会,其中一位演讲者正在谈论 Python。他展示了一个 Memoize 函数,我问是否有任何方法可以防止它被用于非纯函数。他说不,这基本上是不可能的,如果有人能想出办法做到这一点,那将是一篇很棒的博士论文。
这让我很困惑,因为编译器/解释器似乎并不难递归解决。在伪代码中:
function isPure(functionMetadata): boolean;
begin
result = true;
for each variable in functionMetadata.variablesModified
result = result and variable.isLocalToThisFunction;
for each dependency in functionMetadata.functionsCalled
result = result and isPure(dependency);
end;
这是基本的想法。显然,您需要某种检查来防止对相互依赖的函数进行无限递归,但这并不难设置。
采用函数指针的高阶函数可能有问题,因为它们无法静态验证,但我最初的问题假定编译器有某种语言约束来指定只能将纯函数指针传递给某个参数。如果存在的话,可以用来满足条件。
显然这在编译语言中比解释语言更容易,因为所有这些数字运算都将在程序执行之前完成,因此不会减慢任何速度,但我真的没有看到任何基本问题会使其无法评估。
在这方面有更多知识的人知道我缺少什么吗?
【问题讨论】:
-
任何变量访问都必须是本地的,而不仅仅是修改过的。结果取决于全局当前值的函数,即使它不修改该全局,显然也不是纯函数。
-
显而易见的问题:日志记录会影响纯度吗?相反,我想说的是,实际上修改一个全局值(如果这不能抛出),不会影响你的方法的结果,因此即使它显然不是纯的也允许记忆!
标签: algorithm functional-programming static-analysis