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

Mar*_*sUt 4 f#

是否可以检查函数是否被声明为递归,即使用rec?

我有一个memoize函数,但它不适用于任意递归函数.如果用户使用这样的函数调用它,我想给出一个错误.(随意告诉我这是否是处理F#错误的坏方法)

Pet*_*etr 5

F#代码编译为.NET公共中间语言.F#rec关键字只是对F#编译器的一个提示,它使得在函数范围内定义的标识符可用.所以我相信没有办法在运行时发现函数已声明为递归.

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