F#类型推断

时间:2011-02-24 02:06:42

标签: f# type-inference

我对F#有点新意,所以也许我的问题很愚蠢。我在F#中编写了一个使用泛型类型的程序。编译器确定类型不是我想要的方式,因为我在最深的函数调用中有一个错误,我已经将类型实例化为错误的类型。这显然导致我在其他地方使用类型不匹配,就像我预期的那样。我必须提到找到问题的根源,我试图明确地强制执行更高级别的函数,以使用我对泛型类型所需的类型。然而,类型不匹配在那些高级函数中显示,而不是低级函数,类型被实例化。我认为这不是一种非常方便的确定类型的方法,因为通常程序员更容易确定更高级别函数的类型,并且这种显式类型赋值应该导致低级函数中的类型错误,并且已经确定了类型。根据我的经验,似乎编译器的自动类型确定会覆盖显式类型声明。我在这里理解错了吗?

类似下面的代码:

type test<'a,'b>={Func:'a->'b; Arg:'a}

let C(a)=
  a.Func(2)|>ignore

let B(a)=
  C(a)

let A(a:test<int64,int64>)=
  B(a) //<-----------------------the type mismatch is detected here

在这样的高级函数调用中检测到错误使得很难找到问题的根源,因为现在我不仅需要查找有关变量值的错误,还要查找类型确定错误。

1 个答案:

答案 0 :(得分:2)

F#的类型推断是(相当)严格的从上到下,从左到右。请参阅此处进行讨论:Why is F#'s type inference so fickle?

您可以通过重新安排这样的代码(仅用于演示)来检查:

type test<'a,'b>={Func:'a->'b; Arg:'a}

let rec B(a)=
  C(a)

and A(a:test<int64,int64>)=
  B(a)

and C(a)=
  a.Func(2)|>ignore   // type mismatch now here

根据我的经验,便利程度主要取决于具体的代码。但我必须承认,我有时也会因类型不匹配错误消息而感到惊讶。这需要一些时间来适应。