2

I'm started to learn F#, and I noticed that one of the major differences in syntax from C# is that type inference is used much more than in C#. This is usually presented as one of the benefits of F#. Why is type inference presented as benefit?

Imagine, you have a class hierarchy and code that uses different classes from it. Strong typing allows you quickly detect which classes are used in any method. With type inference it will not be so obvious and you have to use hints to understand, which class is used. Are there any techniques that exist to make F# code more readable with type inference?

4

1 回答 1

7

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

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

let map f list = 
  seq { for el in list -> f el }

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

val map : f:('a -> 'b) -> list:seq<'a> -> seq<'b>

这符合我们对我们想要编写的内容的期望——参数f是一个将类型'a值转换为类型值的函数'b,该map函数接受一个'a值列表并生成一个'b值列表。因此,您可以使用类型推断轻松检查您的代码是否符合您的预期。

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

 IEnumerable<int> Select(IEnumerable<int> list, Func<int, int> f) {
   foreach(int el in list) 
     yield return f(el);
 }

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

更多检查。最后,感谢推理,如果您必须显式编写所有类型,F# 语言可以更轻松地检查更多内容。这适用于语言的许多方面,但最好使用度量单位来演示:

let l = 1000.0<meter>
let s = 60.0<second>
let speed = l/s

F# 编译器推断speed具有类型float<meter/second>- 它了解度量单位的工作原理并推断类型,包括单位信息。这个特性真的很有用,但是如果你必须手动编写所有的单元就很难使用(因为类型会变长)。通常,您可以使用更精确的类型,因为您不必(总是)键入它们。

于 2013-05-22T11:12:59.753 回答