我现在意识到这个问题很愚蠢,我本应该提出这个问题。事后来看,我不明白为什么我甚至都会问这个问题 问题出在这里:https://github.com/fsharp/FSharp.Compiler.Service/issues/544
我使用FSharp编译器服务来解析一些F#代码 我现在面对的特定代码是:
let f x y = x+y
let g = f 1
let h = (g 2) + 3
此程序在最后一行没有(+)
调用的情况下产生TAST。也就是说,编译器服务返回TAST,就好像最后一行只是let h = g 2
。
问题是:这是一个我应该报告的合法错误,还是我错过了什么?
let h
行之后g
a value,程序正确解析。g
a normal function(而不是部分应用),程序正确解析。答案 0 :(得分:7)
我没有使用FSharp.Compiler.Services
的先验经验,但我使用Visual Studio的调试器进行了一些小调查。我分析了以下字符串的抽象语法树:
"""
module X
let f x y = x+y
let g = f 1
let h = (g 2) + 3
"""
我发现里面有以下物品:
App (Val (op_Addition,NormalValUse,D:\file.fs (6,32--6,33) IsSynthetic=false),TType_forall ([T1; T2; T3],TType_fun (TType_var T1,TType_fun (...,...))),...,...,...)
正如您所看到的,在32和33之间的第6行 行中添加了一个。
最有可能的解释为什么F#Interactive没有正确显示它是一个库中的错误(可能AST处于不一致状态或漂亮的打印被打破)。我认为您应该在project's issue tracker中提交错误。
更新:
上述对象可以通过以下方式在debbuger中获得:
error.[0]
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpImplementationFileDeclaration.Entity)
.Item2
.[2]
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpImplementationFileDeclaration.MemberOrFunctionOrValue)
.Item3
.f (private member)
.Value
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpExprConvert.ConvExprOnDemand@903)
.expr