【发布时间】:2014-09-04 04:28:27
【问题描述】:
在 Visual Studio 中使用 F#,我发现自己必须明确地注释更多我想要或应该必须的类型。我知道一些解决这个问题的技术,特别是使用优秀的正向管道操作员。然而,在许多情况下,我无法避免这样做,其中一些似乎完全是错误的。
例如,我有类似以下 sn-p 的 F# 代码:
let b = new pqBoard(this)
let b2,steps = b.Solve()
if b2.Solved() then
let cont = steps |> List.exists (fun (s : string) -> s.IndexOf("Contradiction") >= 0 )
第三行生成一条错误消息,提示上一行调用 Solve 方法返回的对中的第一个需要类型注释。但是该对的第二个元素(字符串列表)很好,不需要这样的注释。为什么类型检查器似乎可以确定该对中第二个的类型,而不是从单个调用返回的第一个?
如下修改第二行可以解决问题:
let (b2 : pqBoard,steps) = b.Solve()
为什么我必须明确键入第一个元素而不是第二个元素?
此外,在这种情况和许多其他情况下,VS 在工具提示中正确显示了推断类型。我假设 VS 编辑器在某种意义上是“猜测”,但我还没有看到它猜错了!
我发现必须明确提供类型而对为什么需要它们没有任何好主意,这令人沮丧和失望。任何帮助将不胜感激。
【问题讨论】:
-
能否提供
Solve和Solved的实现? -
关于工具提示 - 有时 VS 会作弊并向后看,这在实际代码中是无法做到的。
-
在不知道
Solve的定义的情况下,我猜它是一个通用函数。使用b2.Solved()需要知道b2的类型,但步骤实际上是由List.exists和s:string注释的类型