5 4 2 F 中的泛型選項型別

2021-06-26 12:16:44 字數 1725 閱讀 5496

5.4.2 f# 中的泛型選項型別

f# 中的泛型型別本質上與 c# 中的泛型類相同,能夠寫更通用和可重用的型別。我們已經知道,在選項型別的情況中,就需要泛型,因為我們希望能夠使用完全相同的泛型型別,建立帶有不同型別的選項值。當然,我們要寫出型別安全的**,還需要知道這個選項型別到底帶有哪種型別。

正如在 c# 中,我們宣告帶有型別引數的型別,作為值型別使用,儲存在 some 可選值中。你可以在 f# interactive 中輸入**,但如果真這樣做了,將必須重新啟動,因為你隱藏了系統實現的 option 型別:

type option<'t> =

|some of 't

|none

宣告泛型型別的語法與c# 中的用法類似:型別引數寫在尖括號中;與 c# 中不一樣的是,必須使用型別引數的專用名,因此,型別引數的名字總是以單引號(')開頭。

在 c# 中,建立泛型類的例項,或者 f# 中建立泛型型別的值時,型別引數用建立這個值時使用的實際型別代替。在 c# 中,當呼叫該建構函式時,必須顯式指定型別;而在 f# 中,型別引數通常是由編譯器推斷的。讓我們看乙個示例:

> some("hi there!");;

val it : option= some"hi there!"

在這個示例中,編譯器推斷出我們要建立包含字串的選項值,因為,我們把字串作為引數值;那麼,編譯器就能推斷出型別引數值是字串,進而推斷出型別為 option。我們將在下一節詳細討論型別推斷。

我們已經看過寫泛型型別的其他語法。這是因為 f# 是相容於 ocaml,它使用了不同的記號方法。我們將使用 .net 語法來寫泛型型別,但理解兩種形式還是有用的,因為說不定也會碰到 ocaml 語法。

寫泛型型別的 ocaml 語法

在 ocaml 語法中,型別引數寫在型別名的前面,因此,我們前面泛型選項型別的示例,可以這樣寫:

type 't option = (...)

當建立此型別的值時,f# 輸出的型別也是使用這種表示方法,some(10) 的型別會顯示為 int option。當宣告的型別有多個型別引數時,引數值都寫在括號中(類似於建立元組值的語法):

type ('t1, 't2) optionallylabeledtuple =(...)

注意,這只是語法上的差別,f# 認為這兩種宣告是一樣的。如果我們宣告型別時使用 ocaml 語法,然後,在使用時用 .net 語法(反之亦然),**仍然是絕對正確。這只是乙個風格問題,但是,出於可讀性的緣故,保持一致仍是乙個好主意。在f# 庫中很多基本型別的宣告,就是使用了與 ocaml 相容的風格;但是,在本書中,我們始終使用 .net 風格,來宣告泛型型別。

我們可以宣告有多個型別引數的泛型型別,與 c# 中的方式完全相同。下面的示例演示如何建立泛型差別聯合,有兩種情況,可以儲存兩個值,可選地為它們指定標籤:

> type optionallylabeledtuple<'t1,'t2> =

|labeledtuple of string * 't1 * string * 't2

|unlabeledtuple of 't1 * 't2;;

> labeledtuple("seven", 7,"pi", 3.14);;

val it : optionallylabeledtuple=

labeledtuple ("seven", 7,"pi", 3.14)

可以看到,當我們建立這個值時,f# 編譯器正確推斷出型別的兩個型別引數。型別推斷是 f# 的基石之一,因此,我們有更多的示例,並把它與 c# 3.0 中的推斷進行比較。

CLR via C 泛型 FCL中的泛型

泛型最明顯的應用就是集合類。fcl在system.collections.generic和system.collections.objectmodel命名空間中提供了多個泛型集合類。system.collections.concurrent命名空間則提供了執行緒安全的泛型集合類。microsoft建...

c 判斷 泛型t 型別 C 泛型方法的型別推斷

這裡所謂的 泛型方法的型別推斷 指的是根據已有的方法實參的型別,推斷出泛型方法的型別實參。例如乙個泛型方法 void method t args 如果我給出方法實參型別是 int,那麼希望能夠推斷出 t int。或者舉個複雜點的例子,對於下面的泛型方法定義 void method ilist a,p...

c 中的強型別 弱型別和泛型

強型別和弱型別的變數都有兩個屬性 型別和值。強型別的變數型別是不能改變的,弱型別的變數型別是隨需改變的,這是強弱的真正含義。我們在編寫c 時,變數型別是明確的,不可更改的,如string就是string,int就是int,這就是強型別,好處 1.能夠享受 提示功能 2.能夠獲得重構工具的支援 3.能...