这是一个非常困难的问题,无论是在实践中还是在理论上。我们正在努力考虑如何针对您的场景(记忆化、自动并行化等)预防或隔离副作用,但这很困难,而且我们距离 C# 的可行解决方案还很远。所以,没有承诺。(如果你真的想消除副作用,可以考虑切换到 Haskell。)
不幸的是,即使发生了奇迹并且你找到了一种方法来防止记忆有副作用的方法,你仍然遇到了一些大问题。考虑以下:
1)如果你记忆一个本身调用记忆函数的函数怎么办?这是一个很好的情况,对吧?您希望能够编写记忆函数。但是记忆化有一个副作用:它将数据添加到缓存中!所以你马上就有了一个元问题:你想驯服副作用,但只有“坏”的副作用。你想鼓励的“好”,你想阻止的坏,很难把它们区分开来。
2)您将如何处理异常?你能记住一个抛出异常的方法吗?如果是这样,它总是抛出相同的异常,还是每次都抛出一个新的异常?如果是前者,你打算怎么做?如果是后者,现在你有一个记忆函数,它在两个不同的调用上有两个不同的结果,因为抛出了两个不同的异常。异常可以看作是副作用;很难驯服例外。
3) 对于没有副作用但仍然不纯的方法,您将如何处理?假设您有一个 GetCurrentTime() 方法。这没有副作用;调用不会改变任何内容。但这仍然不是记忆的候选者,因为任何两个调用都需要产生不同的结果。您不需要副作用检测器,您需要纯度检测器。
我认为你最好的选择是通过教育和代码审查来解决人类问题,而不是试图解决技术难题。