- F# 基礎教程
- F# - 首頁
- F# - 概述
- F# - 環境設定
- F# - 程式結構
- F# - 基本語法
- F# - 資料型別
- F# - 變數
- F# - 運算子
- F# - 決策制定
- F# - 迴圈
- F# - 函式
- F# - 字串
- F# - 選項
- F# - 元組
- F# - 記錄
- F# - 列表
- F# - 序列
- F# - 集合
- F# - 對映
- F# - 辨別聯合
- F# - 可變資料
- F# - 陣列
- F# - 可變列表
- F# - 可變字典
- F# - 基本 I/O
- F# - 泛型
- F# - 委託
- F# - 列舉
- F# - 模式匹配
- F# - 異常處理
- F# - 類
- F# - 結構體
- F# - 運算子過載
- F# - 繼承
- F# - 介面
- F# - 事件
- F# - 模組
- F# - 名稱空間
F# - 泛型
泛型允許您延遲在類或方法中程式設計元素的資料型別規範,直到它在程式中實際使用。換句話說,泛型允許您編寫一個可以處理任何資料型別的類或方法。
您編寫類或方法的規範,並使用資料型別的替代引數。當編譯器遇到類的建構函式或方法的函式呼叫時,它會生成程式碼來處理特定的資料型別。
在 F# 中,函式值、方法、屬性和聚合型別(如類、記錄和辨別聯合)可以是泛型的。
泛型構造至少包含一個型別引數。泛型函式和型別使您能夠編寫適用於各種型別的程式碼,而無需為每種型別重複程式碼。
語法
編寫泛型構造的語法如下:
// Explicitly generic function. let function-name<type-parameters> parameter-list = function-body // Explicitly generic method. [ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] = method-body // Explicitly generic class, record, interface, structure, // or discriminated union. type type-name<type-parameters> type-definition
示例
(* Generic Function *) let printFunc<'T> x y = printfn "%A, %A" x y printFunc<float> 10.0 20.0
編譯並執行程式時,它會產生以下輸出:
10.0, 20.0
您還可以使用單引號語法使函式成為泛型:
(* Generic Function *) let printFunction (x: 'a) (y: 'a) = printfn "%A %A" x y printFunction 10.0 20.0
編譯並執行程式時,它會產生以下輸出:
10.0 20.0
請注意,當您使用泛型函式或方法時,您可能不必指定型別引數。但是,如果存在歧義,您可以像在第一個示例中那樣在尖括號中提供型別引數。
如果您有多個型別,則用逗號分隔多個型別引數。
泛型類
與泛型函式類似,您還可以編寫泛型類。以下示例演示了這一點:
type genericClass<'a> (x: 'a) =
do printfn "%A" x
let gr = new genericClass<string>("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )
編譯並執行程式時,它會產生以下輸出:
"zara" seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]
廣告