【问题标题】:How to check if a function has no side-effects (is pure) at runtime?如何检查函数在运行时是否没有副作用(纯)?
【发布时间】:2020-06-25 01:13:56
【问题描述】:

假设我们已经加载了一个函数F,它接收/取出一组args并返回一个result。如果这个F 不作用于args 成员和函数以外的任何东西,如何在运行时检查?意思是没有Console.Writeline,单例(或args 中没有出现的其他东西)。 CodeContracts 库或其他解决方案是否有可能?

假设我们知道[Pure] 属性出现在函数定义中。当我们有 lambda 时,这在很多情况下都很糟糕,但至少它会是一些东西

为什么我看不到 [Pure] 有什么帮助 - 这段代码可以编译:

class Test {
    public struct Message {
        public string Data;
    }

    public struct Package {
        public int Size;
    }

    [Pure]
    public static List<Package> Decomposse(Message m) {
        Console.WriteLine("rrrr"); // This sould not happen
        var mtu = 1400;
        Package p = new Package{Size = mtu};
        return Enumerable.Repeat(p, m.Data.Length / mtu).ToList();
    }
}

而且我想消除(或至少检测到该函数调用像Console.WriteLine("rrrr") 这样的东西)

【问题讨论】:

  • 我想您必须分析方法体 IL 以查看它是否发生了任何变化。这可能比在编译后进行代码分析更容易(不确定是否存在用于此的工具)。
  • "如何检查一个函数在运行时是否没有副作用(是纯的)?" - 非常困难......当然如果它没有装饰[Pure] 属性,但要证明它是另一回事。
  • @MichaelRandall:假设我们在该函数上有[Pure] 属性-我们如何从调用方检查?
  • 你能把函数加载为Expression吗?这将更容易验证,然后编译。但仍然不是微不足道的......
  • @JeremyLakeman:我想使用expressive,但他们没有提供任何简单的方法来表达类类型......也许我最终会选择 Roslyn

标签: c# .net reflection side-effects


【解决方案1】:

函数是否有输入或结果并不重要。代码体中可能会发生太多事情,例如实例化的对象构造函数。问题在于现代语言。

仅检索 DateTime.Now() 之类的数据的安全 API 调用怎么样?您是否要为您组织中或地球上的所有应用程序构建一个改变状态并随着时间的推移为我们其他人保持更新的 API 调用列表?您是否要记录编译器内联的处理过程?那么通过将这种方法简化为荒谬,我们是否可以接受它不可行?

我的架构模型只应更改“产品”数据点的机器,但即使我承认这是一个无法执行的规则。我还有其他规则来尝试强制执行确定性。但是,这些模块必须在某个时候调用 API 才能完成今天已经在 API 中组织的有意义的工作。否则我们将全部重写。

    class Machine1Product
    {
        public Cvar<int> Y { get; set; }
    }
    class Machine1 : Producer<Machine1Product>, IMachine
    {
        public Cvar<int> X { get; set; }
        public void M()
        {
            // work which changes only product data points (Y)
        }
    }

在为函数开发极简语言之前,没有观察或预防副作用。

【讨论】:

  • 是的 - 我希望函数是 [Pure],从某种意义上说,它可以调用其参数成员、数学函数,并且不能调用其他任何东西
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多