当我尝试创建像这样的类时
type MyType () =
let func<'T> () = ()
编译器说有一个错误:
显式类型参数只能在模块或成员绑定上使用
但是MSDN说:
模块级、类型或计算表达式中的let绑定可以具有显式类型参数。表达式中的let绑定(例如在函数定义中)不能具有类型参数。
为什么文档和编译器说的东西不同?
这似乎是对类内let
绑定的语法限制。然而,您仍然可以定义一个通用的本地函数,您只需要在类型注释中指定类型参数:
type MyType () =
let func (x : 'T) : 'T = x
我不认为这在语法上被规范明确禁止,因为规范说类定义具有以下结构:
键入类型名称patopt作为defnopt=
;类继承declopt
;类函数或值defnsopt
;类型defn元素
和类或值defn定义为:
类函数或值defn:=attributesopt
static
optlet
rec
option函数或值defn-
其中函数或值defns可以是具有显式类型参数的函数定义:
函数defn:=
inline
optaccess
opt标识符或操作类型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>)