Types F中的类型推理问题

Types F中的类型推理问题,types,f#,inference,Types,F#,Inference,在VisualStudio中使用F,我发现自己必须显式地注释更多我想要或应该注释的类型。我知道解决这个问题的一些技巧,特别是使用优秀的前向管道操作员。然而,在许多情况下,我无法避免这样做,其中一些似乎完全错了 例如,我有类似以下代码片段的F代码: let b = new pqBoard(this) let b2,steps = b.Solve() if b2.Solved() then let cont = steps |> List.exists

在VisualStudio中使用F,我发现自己必须显式地注释更多我想要或应该注释的类型。我知道解决这个问题的一些技巧,特别是使用优秀的前向管道操作员。然而,在许多情况下,我无法避免这样做,其中一些似乎完全错了

例如,我有类似以下代码片段的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编辑器在某种意义上是在猜测,但我还没有看到它猜测错误


我发现必须明确地提供类型而不知道为什么需要它们,这既令人沮丧又令人失望。任何帮助都将不胜感激。

如果看不到pqBoard和Solve成员的定义,就很难确定到底发生了什么,但是b2和示例中的步骤之间的关键区别在于如何使用它们,而不是如何生成它们


在步骤的情况下,它被传递到List.exists,它必须采用List而不查看pqBoard和Solve成员的定义。很难确定到底发生了什么,但是b2和示例中的步骤之间的关键区别在于它们的使用方式,而不是它们的生成方式


在步骤的情况下,它被传递到List.exists,它必须采用List。你能提供Solve和Solved的实现吗?至于工具提示-有时VS欺骗和向后看,这在实际代码中是无法做到的。如果不知道Solve的定义,我想这是一个泛型函数。使用b2.Solved需要知道b2的类型,但步骤实际上是由List.exists和s:Strings注释的类型。你能提供Solve和Solved的实现吗?至于工具提示-有时VS欺骗和向后看,这在实际代码中是无法做到的。如果不知道Solve的定义,我想这是一个泛型作用使用b2.Solved需要知道b2的类型,但是步骤实际上是由List.exists和s:string注释的类型。非常感谢。我认为你关于它不具有普遍性的评论是造成我困惑的主要原因,但我希望从现在起我不会那么困惑。非常感谢。我认为你关于它不具有普遍性的评论是造成我困惑的主要原因,但我希望从现在起我不会那么困惑。