类中let绑定中的显式类型参数



当我尝试创建像这样的类时

type MyType () =
let func<'T> () = ()

编译器说有一个错误:

显式类型参数只能在模块或成员绑定上使用

但是MSDN说:

模块级、类型或计算表达式中的let绑定可以具有显式类型参数。表达式中的let绑定(例如在函数定义中)不能具有类型参数。

为什么文档和编译器说的东西不同?

这似乎是对类内let绑定的语法限制。然而,您仍然可以定义一个通用的本地函数,您只需要在类型注释中指定类型参数:

type MyType () =
let func (x : 'T) : 'T = x

我不认为这在语法上被规范明确禁止,因为规范说类定义具有以下结构:

键入类型名称patopt作为defnopt=
   ;类继承declopt
   ;类函数或值defnsopt
   ;类型defn元素

类或值defn定义为:

类函数或值defn:=attributesoptstaticoptletrecoption函数或值defn-

其中函数或值defns可以是具有显式类型参数的函数定义:

函数defn:=
inlineoptaccessopt标识符或操作类型defnsoption参数pats return typeopt=expr

要添加到Tomas的答案中,如果您需要一个类型参数,但没有该类型的值,则可以使用带有幻影类型参数的类型。例如:

open System
type Foo() =
member x.PrintType<'T> () = printfn "%s" typeof<'T>.Name
type TypeParameter<'a> = TP
let foo = Foo ()
let callFoo (typeParameter : TypeParameter<'a>) =
foo.PrintType<'a> ()
callFoo (TP : TypeParameter<string>)
callFoo (TP : TypeParameter<DateTime>)

最新更新