【发布时间】:2014-11-26 22:44:36
【问题描述】:
在使用带有度量单位类型参数的自定义类型时,我遇到了编译器错误“本地调用的类型参数数量不正确”,我不明白为什么。
这个问题已经过多次修改。现在看来该错误很可能是由编译器或 IDE 错误引起的。
我可以将其缩小到以下(尝试复制时请阅读以下几点):
type R<[<Measure>] 'u> (f : float<'u>) =
member r.Member = f
let get (r : R<_>) = r.Member
let foo =
let problem _ = List.map get
problem // Error: Incorrect number of type arguments to local call
最后一行给出了错误,这特别奇怪,因为它只是返回一个已经定义的标识符。我正在编译为库或可执行文件。一些重要的繁殖观察结果:
IntelliSense 不预测此错误。需要实际编译才能看到。
使用优化编译时我还没有看到错误。 (为了重现,请使用例如 Visual Studio 中的默认调试编译。感谢 Freenode 上的 zapu 指出这一点。)
我还没有看到 F# 交互中的错误。
删除
problem(_)的无用参数,使错误消失。将
problem的 let-binding 移出foo会使错误消失。 这可能与作为 F# 函数的编译有关吗?我听说这是由problem类型周围的附加括号表示的。删除计量单位使用会使错误消失。
将
problem标记为inline会使错误消失。
许多看似无关的更改消除了错误。但在实际用例中并不是那么容易,尤其是当我在尝试之前不知道某个更改是否能修复错误时。
我会很高兴收到任何关于此的提示。是什么原因造成的?它是一个错误吗?如果是,它是否已知?如何避免?
版本 已使用 F# 的 3.0 到 3.1.2 版本进行了测试。我安装了新的 Visual Studio 2013 社区版并使用它提供的版本进行了测试,结果相同。它也出现在 Visual Studio 2012 (F# 3.0) 中。
更新:我已经要求其他人对此进行测试,并且该行为通常可以在 Visual Studio 2012 或 2013 中重现。
【问题讨论】:
-
对我来说没有编译器错误,但
problem _语法似乎非常奇怪,我不确定你要做什么。 -
@JohnPalmer 我只是想重现错误,而不复制导致它在生产中出现的更大代码,这就是结果。我删除了对版本 3.1.1 的提及。不过从这个问题来看;我可能在不知不觉中一直在使用 3.0 编译器。我正试图弄清楚现在发生了什么,如果我发现了什么,我会更新这个问题。也许我愚蠢地遇到了一个已经修复的错误。
-
@JohnPalmer 我现在正在新安装的 Visual Studio 2013 社区版上进行测试,可以说是当前的标准设置,但仍然存在问题。你能告诉你具体用的是什么吗?繁殖的每一点你都注意了吗?
-
我在 Linux 上使用 F# 3.1
标签: f#