[英]Type inference problems in F#
在Visual Studio中使用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
成员的定义的pqBoard
,很难确定到底发生了什么,但是样本中b2
和steps
之间的主要区别在于它们的使用方式以及生成方式。
如果是steps
,则将其传递到List.exists
,该list<'a>
必须对某些'a
使用list<'a>
,并且显式注释了函数参数以采用string
,因此类型检查器可以立即看到steps
必须为键入list<string>
。
对于b2
,正在调用成员函数。 带有名为Solved
的成员函数的类型可能很多,而F#没有某种方式不知道b2
的类型就无法解决调用这些类型中的哪一种。
总的来说-尽管不是通用的-使用.
在F#中,通常需要在左侧添加事物的类型.
在更早的地方明确指定,而不会使用功能更多的结构和类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.