5.4.4 寫泛型函式
大多數使用泛型型別的函式或方法都是高階的,意味著它們取另乙個函式作為引數值。這是乙個重要的主題,我們會專門用一整章 (第 6 章)來討論,但我們已經可以寫乙個泛函式,而不用誤入高階領域。我們將建立乙個函式,它取乙個選項型別,並返回包含的值。如果這個選項型別不包含乙個值,該函式將引發異常。我們可以先看一下 c# 版本:
t readvalue(option opt)
如你所見,我們已經建立了具有單個型別引數的泛型方法。用在方法簽名中的型別引數既作為乙個返回值,也作為給泛型型別 option 的引數。在方法體內,我們使用它再次宣告這個型別的本地變數。總體而言,我們不得不 4 次提及 t。
這正是 f# 的型別推斷確實非常出色的情況。看一下在 f# 中實現同樣的事情。有趣的是,我們仍然不需要指定任何型別:
> let readvalue(opt) =
match opt with
| some(v) –> v
| none -> failwith "no value!";;
val readvalue : 'a option –> 'a
可以看到從推斷出的型別簽名,函式正是泛型,與 c# 版本完全一樣。允許這樣的功能被稱為自動泛型化(automatic generalization),我們後面會深入討論到它,就目前而言,這裡作乙個 20 秒的說明:f# 型別推理演算法搜尋最通常的方式分配型別和其他一切作為泛型型別引數。這裡,它知道引數值(opt)是選項型別,因為,我們根據 some 和 none 識別器來匹配它。它也知道該函式返回包含在選項型別中的值,但它不知道是哪種型別,因此,它把這個型別看作泛型型別引數。
希望這已激起了你的興趣,你期待聆訊更多關於自動泛型化和高階函式的內容——但是,首先讓我們完成常見的函式值之旅。在其他語言中,通常不把函式看作值,但這是使函式程式設計如此強大而優雅的乙個重要方面。
6 1 1 寫 F 中的泛型函式
6.1.1 寫 f 中的泛型函式 在第 5 章,我們看到了乙個簡單的泛型函式,它只使用單個引數值,是乙個泛型選項型別。清單 6.1 顯示 condprint 方法的 f 實現,來自 在函式式程式設計和物件導向中的泛型 側邊欄。它有三個引數值 乙個值 乙個函式,用於 測試是否應列印這個值,還有乙個函式...
泛型函式Func
泛型函式,即可以接受任何型別的通用函式 有where約束除外 例如 呼叫getcachedata,那第二個委託引數就是func,這個函式返回值也是int 呼叫getcachedata,那第二個委託引數就是func,這個函式返回值是string public static intstrtoint st...
C 泛型約束,泛型函式
class 泛型 sortss new sort 例項化乙個排序類 ss.sortt pr 呼叫排序函式 foreach pression ppr in pr 測試泛型函式 int a 5 console.writeline a a int b 9 console.writeline b b n p...