我在计算器Dev天《公约》昨天和一个人说的是蟒蛇。他表现出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;

这是基本的想法。明显地你会需要某种形式的检查,以防止无限递归上的相互依赖功能,但是这是不太难以成立。

高级功能,采取功能的指针也许是有问题的,因为他们不能证实静,但是我原来的问题的先决条件的编译器具有某种语言约束的指定,只有一个纯粹的功能指针可以通过向某些参数。如果一个人存在,可能被用来满足的条件。

显然,这会更容易在编制语言,比一个解释性的,因为所有这些数字将完成之前,执行该程序,因此不慢下任何东西,但是我并不真的看到任何基本问题,就不可能来评估。

任何人都不会有更多的知识,在这方面的知道我的失踪?

有帮助吗?

解决方案

Python中特别难。由于 anObject.aFunc 可以在运行时任意改变,因此无法在编译时确定哪个函数将 anObject.aFunc()调用,或者即使它将是一个函数

其他提示

您还需要注释每个系统调用,每个FFI,......

此外,最微小的“泄漏”往往泄漏到整个代码库中。

这不是一个理论上难以处理的问题,但在实践中,以一种整个系统不会感到脆弱的方式进行是非常困难的。

顺便说一句,我认为这不是一篇优秀的博士论文; Haskell实际上已经有了这个版本,并且有IO monad。

我相信很多人会继续在实践中看到这个。 (疯狂猜测)20年后我们可能会有这个。

除了这里的其他优秀答案之外:您的伪代码仅查看函数是否修改变量。但那不是真正的“纯粹”手段。 "纯QUOT;通常意味着更接近“引用透明”的东西。换句话说,输出完全取决于输入。所以简单到读取当前时间并将其作为结果中的一个因素(或从输入读取,或读取机器的状态,或......)使得函数非纯粹而不修改任何变量。

另外,你可以写一个“纯粹的”修改变量的函数。

当我读到你的问题时,这是我脑海中浮现的第一件事。

  

类层次结构

确定变量是否被修改包括挖掘在变量上调用的每个方法以确定它是否在变异的行为。对于具有非虚方法的密封类型,这是......有点直接。

但考虑虚拟方法。您必须找到每个派生类型,并验证该方法的每个重写都不会改变状态。在允许动态代码生成的任何语言/框架中确定这是不可能的,或者仅仅是动态的(如果可能的话,这是非常困难的)。原因是派生类型集不是固定的,因为可以在运行时生成新的派生类型。

以C#为例。没有什么能阻止我在运行时生成派生类,它会覆盖该虚拟方法并修改状态。静态验证将无法检测到此类修改,因此无法验证方法是否纯粹。

我认为主要问题是如何有效地做到这一点。

D语言具有纯函数,但您必须自己指定它们,因此编译器会知道检查它们。我想如果你手动指定它们那么它会更容易。

通常,确定给定函数是否纯粹是可以减少来决定是否任何给定程序将停止 - 众所周知,停止问题是无法有效解决的问题。

注意,复杂程度取决于语言。为更为动态语言,这是可以重新确定任何事情在任何时间。例如,在Tcl

proc myproc {a b} {
    if { $a > $b } {
        return $a
    } else {
        return $b
    }
}

每一件可以随时修改。例如:

  • "如果"的命令可以改写使用和更新全球变量
  • "返回"的命令,沿着同一思路,可以做同样的事情
  • 这可能是一个执行跟踪上,如果命令,该命令时,"如果"被使用,该命令返回被重新定义的基础上的投入,如果命令

诚然,Tcl是一个极端的情况;一个最有活力的语言。这就是说,它突出的问题,它可能难以确定在纯度的功能,即使是一旦你进入了它。

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