F#构造函数约束

  • 本文关键字:约束 构造函数 f#
  • 更新时间 :
  • 英文 :


在尝试学习构造函数约束的使用时,我希望以下内容是可能的。

type Foo<'T when 'T : (new : int -> 'T)> = {Bar: 'T}

但这并不编译,只是返回错误

'new'约束必须采用一个类型为'unit'的参数,并返回构造的类型

似乎应该调用约束";无参数构造函数约束";因为我无法编译除此之外的任何其他表单。

type Foo<'T when 'T : (new : unit-> 'T)> = {Bar: 'T}

构造函数约束是否可以用于约束泛型类型构造函数,使其具有除unit之外的特定签名?

如注释中所述,.NET对约束的支持是有限的,并且只支持(i(无参数构造函数和(ii(接口的实现。

F#对普通泛型类型参数遵循相同的构造,但它也有静态解析的类型参数,写为^T,可以具有更具表达性的约束。这些并没有编译为.NET约束,而是在编译过程中被删除,因此还有其他约束。

一个类似于使用静态memnber约束的例子看起来是这样的:

type Foo<'T> = 
{ Bar : 'T }
static member inline Demo< ^S when ^S : (static member Create : int -> ^S)>() = 
{ Bar = (^S : (static member Create : int -> ^S) (10)) }

约束需要在内联成员(或内联函数(上,所以我定义了一个泛型类型Foo<'T>,它有一个静态成员Demo,可以用任何具有取int的Create方法的类型调用。例如:

type Sample(n:int) =
member x.N = n
static member Create(n:int) = Sample(n)

现在,我们可以用Sample作为类型参数调用Foo.Demo,并返回使用10作为初始化值创建的Foo<Sample>

let f = Foo<_>.Demo<Sample>()

最新更新