2013-05-22 110 views
2

我開始學習F#,並且我注意到C#語法的一個主要區別在於,類型推斷的使用遠遠多於C#中的類型推理。這通常是F#的一個好處。爲什麼將類型推斷表示爲好處?類型推斷的好處是什麼?

想象一下,您有一個類層次結構和使用不同類的代碼。強大的打字功能可以讓您快速檢測出在任何方法中使用哪些類。 通過類型推斷,它不會如此明顯,您必須使用提示來了解使用哪個類。是否有任何技術可以通過類型推斷使F#代碼更具可讀性?

+1

這是一個廣泛的問題@eternity。也許你可以編輯你的問題更具體一些? –

回答

7

這個問題假設您在F#中使用面向對象的編程(例如複雜的類層次結構)。雖然您當然可以這樣做,但使用OO概念主要用於互操作性或在.NET庫中包裝某些F#功能。

理解代碼。當您在函數樣式中編寫代碼時,類型推斷變得更有用。它使代碼更短,但也有助於你理解正在發生的事情。例如,如果你寫在名單map功能(在LINQ的Select法):

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> - 它知道如何衡量工作的單位和推斷的類型包括單元信息。這個功能非常有用,但如果你必須手動編寫所有單元(因爲類型變長),這將很難使用。一般來說,您可以使用更精確的類型,因爲您不必(始終)鍵入它們。

+0

感謝您提供詳細的答案,特別是關於自動泛化的解釋 - 我不知道這個功能。 – eternity