6 6 1 F 中函式呼叫的型別推斷

2021-06-27 02:11:36 字數 879 閱讀 1653

6.6.1 f# 中函式呼叫的型別推斷

雖然,在 f# 中可以用尖括號指定型別引數值,與 c# 中的方式相同,但這種方法很少使用。原因是,當編譯器無法推斷出所有的資訊,需要程式設計師的幫助時,我們僅在真正需要的地方,新增型別批註。我們用乙個示例來演示:

> option.map (fun dt -> dt.year)(some(datetime.now));;

error fs0072: lookup on object ofindeterminate type.

> option.map (fun (dt:datetime) ->dt.year) (some(datetime.now));;

val it : int option = some(2008)

與 c# 不一樣,f# 中引數值的順序很重要,因此,第一種情況會失敗。這是因為f# 編譯器要遇到第二個引數值時,才知道 dt 值是 datetime 型別,所以,在處理第乙個引數值時,它不知道 year 屬性是否存在。在第二種情況中,我們糾正了這個問題,新增了型別批註,顯式指定 dt 值的型別。如果我們使用管道來寫前面的**段,就不需要型別批註,這是使用管道運算子重要的原因:

> some(datetime.now) |> option.map(fun dt -> dt.year);;

val it : int option = some(2008)

現在**能執行,是因為包含了 datetime 值的選項值先出現,因此,在 lambda 函式之前被處理;當處理 lambda 函式時,編譯器已經知道 dt 的型別肯定是 datetime,這樣,它就可以找到 year 屬性,而不會有問題。

到目前為止,我們已經看到了 c# 和 f# 有關型別推斷的相似之處,但 f# 走得更遠;現在,我們就看一下 f# 編譯器對寫高階函式的幫助。

5 4 3 1 C 3 0 中的型別推斷

5.4.3.1 c 3.0 中的型別推斷 在 c 中,值型別推斷主要用 var 關鍵字表示,這是 c 3.0 的新功能。我們前面已經看到,但通過清單 5.12 的幾個例子,我們可以更詳細地討論一下。清單 5.12 使用 var 關鍵字進行型別推斷 c var num 10 2 16 var str ...

Go 型別斷言的實踐案例(含型別推斷函式實現)

package main import fmt 宣告 定義乙個介面 type usb inte ce type phone struct 讓phone 實現 usb介面的方法 func p phone start func p phone stop func p phone call type ca...

F 學習筆記(一)F 中的資料型別

最近,隨著vs2010 beta2 的發布,下了最新的vs2010旗艦版,在win7上跑了下,還是蠻吃記憶體的,對於f 這個新增事物,也看了些原版的資料。f 是由微軟發展的為微軟.net語言提供執行環境的程式語言。它是基於ocaml的,而ocaml是基於ml 函式程式語言的。這是乙個用於顯示.net...