检查函数是否被声明为递归

是否有可能检查一个函数是否被声明为递归的,即让let rec?

我有一个memoize函数,但它不适用于任意递归函数。 如果用户使用这种功能调用它,我想提供一个错误。 (随意告诉我这是否是一种处理F#中错误的不好方法)


F#代码被编译为.NET Common Intermediate Language。 F# rec关键字仅仅是F#编译器的一个提示,它使正在定义的标识符在函数的作用域中可用。 所以我相信在运行时没有办法找到该函数被声明为递归的。

但是,您可以使用System.Diagnostic.StackTrace类(https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx)在运行时获取和分析堆栈帧。 但是访问堆栈信息会对性能产生重大影响(我假设你的memoization函数是为了加速程序性能)。 由于编译器可以进行优化,因此堆栈信息在您的程序的调试版本和发行版本中可能会有所不同。


我认为不能以合理和全面的方式来完成。

你可能想重新评估你的问题。 我假设你的函数对递归函数“不起作用”,因为它只记忆第一次调用,所有的递归调用都转到非memoized函数中? 根据你的情况,这可能不是一件坏事。

Memoization为了提高速度而折腾内存。 在一个大系统中,如果你只关心最后一个结果,你可能不想支付记忆中间结果的成本。 所有这些字典随着时间的推移而加起来。

如果你特别关心记忆递归函数,那么你可以明确地将它构造成适用于记忆的方式。 查看链接的线程。

所以我的答案是,memoize函数根本不应该关心递归。 如果用户想记忆一个递归函数,那么理解所涉及的权衡关系,并且以一种允许中间调用被记忆的方式来构造该函数,如果这是他所要求的。

链接地址: http://www.djcxy.com/p/80545.html

上一篇: Check if function is declared recursive

下一篇: F#: Attempt to memoize member function resets cache on each call?