【问题标题】:Compiler error "Incorrect number of type arguments to local call"编译器错误“本地调用的类型参数数量不正确”
【发布时间】: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#


【解决方案1】:

这确实是一个错误。我报告了它,它是由 Andrew Kennedy 于 2015-01-30 修复的; see this issue report for Visual F# on Github.

有趣的副作用:这个问题的荒谬代码最终成为回归测试。 (这是公共领域,以防万一)

F# 的未来版本应该不再有这个问题。感谢所有帮助复制、分析和修复它的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2017-10-17
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多