我目前正在制作一个使用 FSharp 编译器服务分析 FSharp 程序的类型化 AST 的应用程序。
在识别模块级声明上的相互递归函数时,我遇到了问题。
TAST 模式允许我确定一个表达式是否是该模式的递归 let:
| BasicPatterns.LetRec(recursiveBindings, bodyExpr) ->
但是,如果我在模块级别,我会(在 2 个相互递归函数的情况下)在实现文件声明的匹配规则上获得 2 个不相关的匹配项:
| FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(memberOrFuncOrVal, args, body) ->
我已经非常彻底地查看了 memberOrFuncOrVal、args 和 body 的类型,发现没有提到 let 绑定是递归的这一事实,也没有提到任何对其他相互递归函数的引用。
这些信息在 Typed AST 级别根本不可用,还是我找错地方了?