类型推断有什么好处?

ete*_*ity 2 f# type-inference

我开始学习F#,我注意到C#语法的一个主要区别是类型推断比C#使用得多.这通常表现为F#的好处之一.为什么类型推断表现为有益?

想象一下,你有一个类层次结构和使用不同类的代码.强类型允许您快速检测在任何方法中使用的类.使用类型推断它不会那么明显,你必须使用提示来理解,使用哪个类.是否存在任何使用类型推断使F#代码更具可读性的技术?

Tom*_*cek 7

这个问题假设你在F#中使用面向对象的编程(例如复杂的类层次结构).虽然您当然可以这样做,但使用OO概念主要用于互操作性或在.NET库中包装一些F#功能.

理解代码.在函数样式中编写代码时,类型推断变得更有用.它使代码更短,但也可以帮助您了解正在发生的事情.例如,如果您map在列表上编写函数(SelectLINQ中的方法):

let map f list = 
  seq { for el in list -> f el }
Run Code Online (Sandbox Code Playgroud)

类型推断告诉您函数类型是:

val map : f:('a -> 'b) -> list:seq<'a> -> seq<'b>
Run Code Online (Sandbox Code Playgroud)

这符合我们对要编写的内容的期望 - 参数f是将类型'a值转换为类型值'bmap函数,函数采用'a值列表并生成'b值列表.因此,您可以使用类型推断来轻松检查您的代码是否符合您的预期.

概括.自动泛化(在注释中提到)意味着上面的代码尽可能自动重用.在C#中,您可能会写:

 IEnumerable<int> Select(IEnumerable<int> list, Func<int, int> f) {
   foreach(int el in list) 
     yield return f(el);
 }
Run Code Online (Sandbox Code Playgroud)

此方法不是通用的 - 它Select仅适用于int值集合.但是没有理由将它限制在int- 相同的代码适用于任何类型.类型推断机制可帮助您发现此类概括.

更多检查.最后,由于推断,如果你必须明确地编写所有类型,F#语言可以更容易地检查更多的东西.这适用于该语言的许多方面,但最好使用度量单位进行演示:

let l = 1000.0<meter>
let s = 60.0<second>
let speed = l/s
Run Code Online (Sandbox Code Playgroud)

F#编译器推断出speed有一种类型float<meter/second>- 它了解度量单位的工作方式并推断出包括单位信息在内的类型.这个功能非常有用,但是如果必须手动编写所有单元(因为类型变长),这将很难使用.通常,您可以使用更精确的类型,因为您不必(始终)键入它们.