以統計方式解析的型別參數 (F#)
「以統計方式解析的型別參數」(Statically Resolved Type Parameter) 是在編譯階段 (而非執行階段) 取代為實際型別的型別參數。 它們的前面會加上插入號 (^)。
ˆtype-parameter
備註
在 F# 語言中,有兩種不同類型的型別參數。 第一種是標準泛型型別參數。 這些項目是以所有格符號 (') 表示 (如 'T 和 'U)。 它們相當於其他 .NET Framework 語言中的泛型型別參數。 另一種是以統計方式進行解析並以插入號表示 (如 ^T 和 ^U)。
以統計方式解析的型別參數主要是與成員條件約束搭配使用,而成員條件約束可讓您指定型別引數必須要具有特定成員才能使用。 使用一般泛型型別參數,並無法建立這種條件約束。
下表彙總兩種型別參數的相似處和差異。
功能 |
泛型 |
以統計方式解析的 |
---|---|---|
語法 |
'T, 'U |
^T, ^U |
解決時間 |
執行階段 |
編譯階段 |
成員條件約束 |
無法與成員條件約束搭配使用。 |
可以與成員條件約束搭配使用。 |
程式碼產生 |
具有標準泛型型別參數的型別 (或方法) 會產生單一泛型型別或方法。 |
會產生型別和方法的多個執行個體化 (一種型別需要有一個執行個體化)。 |
與型別搭配使用 |
可以用於型別。 |
不可以用於型別。 |
與內嵌函式搭配使用 |
否。 內嵌函式無法使用標準泛型型別參數進行參數化。 |
是。 以統計方式解析的型別參數無法用於不是內嵌的函式或方法。 |
許多 F# 核心程式庫函式 (特別是運算子) 具有以統計方式解析的型別參數。 這些函式和運算子是內嵌的,並會導致數值計算的有效率程式碼產生。
使用運算子的內嵌方法和函式 (或使用其他具有以統計方式解析之型別參數的函式) 也可以使用以統計方式解析的型別參數本身。 通常,型別推斷會將這類內嵌函式推斷為具有以統計方式解析的型別參數。 下列範例說明推斷為具有以統計方式解析之型別參數的運算子定義。
let inline (+@) x y = x + x * y
// Call that uses int.
printfn "%d" (1 +@ 1)
// Call that uses float.
printfn "%f" (1.0 +@ 0.5)
(+@) 的已解析型別是根據 (+) 和 (*) 的用法,而兩者都會導致型別推斷來推斷以統計方式解析之型別參數上的成員條件約束。 已解析型別 (如 F# 解譯器所示) 如下。
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
輸出如下。
2
1.500000