📜  F#-泛型

📅  最后修改于: 2020-11-21 06:57:37             🧑  作者: Mango


泛型允许您延迟对类或方法中编程元素的数据类型的指定,直到在程序中实际使用它为止。换句话说,泛型允许您编写可与任何数据类型一起使用的类或方法。

您编写类或方法的规范,并用替代参数表示数据类型。当编译器遇到类的构造函数或方法的函数调用时,它将生成代码以处理特定的数据类型。

在F#中,函数值,方法,属性和聚合类型(例如类,记录和已区分的并集)可以是通用的。

泛型构造包含至少一个类型参数。通用函数和类型使您可以编写适用于各种类型的代码,而无需为每种类型重复执行代码。

句法

编写通用构造的语法如下-

// Explicitly generic function.
let function-name parameter-list =
   function-body

// Explicitly generic method.
[ static ] member object-identifer.method-name parameter-list [ return-type ] =
   method-body

// Explicitly generic class, record, interface, structure,
// or discriminated union.
type type-name type-definition

例子

(* Generic Function *)
let printFunc x y =
   printfn "%A, %A" x y

printFunc 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 (x: 'a) =
   do printfn "%A" x

let gr = new genericClass("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )

编译并执行程序时,将产生以下输出-

"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]