静态解析的类型参数 (F#)

“静态解析的类型参数”是一种类型参数,在编译时(而不是运行时)将被替换为实际类型。 这类参数前面有一个插入符号 (^)。

ˆtype-parameter

备注

F# 语言中有两种不同的类型参数。 第一种是标准的泛型类型参数。 如同在 'T 和 'U 中一样,这些类型参数由撇号 (') 指示。 它们与其他 .NET Framework 语言中的泛型类型参数等效。 另外一种类型参数以静态方式解析并由一个插入符号指示,如同在 ^T 和 ^U 中一样。

静态解析的类型参数主要与成员约束一起使用,成员约束允许您指定必须具有一个或多个特定成员才能使用的类型参数。 无法通过使用常规的泛型类型参数来创建这种约束。

下表总结了两种类型参数的相同点和不同点。

功能

泛型

静态解析的

语法

'T, 'U

^T, ^U

解析时间

运行时

编译时

MemberConstraints

不能与成员约束一起使用。

可以与成员约束一起使用。

代码生成

具有标准泛型类型参数的类型(或方法)导致生成单一泛型类型或方法。

生成类型和方法的多个实例化(为需要的每个类型生成一个)。

与类型一起使用

可以对类型使用。

不能对类型使用。

与内联函数一起使用

不能。 内联函数不能与标准泛型类型参数一起进行参数化。

是。 静态解析的类型参数不能用于不是内联的函数或方法。

许多 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

请参见

参考

泛型 (F#)

类型推理 (F#)

约束 (F#)

概念

内联函数 (F#)

其他资源

自动泛化 (F#)