F# - 泛型( Generics)
优质
小牛编辑
126浏览
2023-12-01
泛型允许您在类或方法中延迟编程元素的数据类型的指定,直到它在程序中实际使用。 换句话说,泛型允许您编写可以使用任何数据类型的类或方法。
您可以使用数据类型的替换参数编写类或方法的规范。 当编译器遇到类的构造函数或方法的函数调用时,它会生成处理特定数据类型的代码。
在F#中,函数值,方法,属性和聚合类型(如类,记录和区分联合)可以是通用的。
通用构造包含至少一个类型参数。 通用函数和类型使您能够编写适用于各种类型的代码,而无需重复每种类型的代码。
语法 (Syntax)
编写泛型构造的语法如下 -
// 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
例子 (Examples)
(* 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); ...]