Don Syme的建议似乎不适用于这种情况。
type WrappedFunction<'a,'b> =
private {
Function:'a -> 'b
}
static member Make (f:'a -> int) = {Function = f}
static member Make (f:'a -> string) = {Function = f}
在中使用时
let a = WrappedFunction.Make (fun (a:DateTime) -> a.ToString())
导致警告。
这里缺少的细节是:没有规则规定Make
静态方法必须返回定义它们的相同类型。
看看这个:
let w : WrappedFunction<int,int> = WrappedFunction<int,bool>.Make (fun i -> string i)
即使我在WrappedFunction<int,bool>
上调用了Make
函数,但结果的类型是WrappedFunction<int,int>
,这也是可行的。
第二个类型参数'b
在Make
的签名中没有提及,因此它不必匹配任何内容。但它仍然需要以某种方式被知道,因此需要明确指定。如果您没有明确指定它,就会收到警告。
有了第一个类型参数'a
,情况就不同了:由于它在Make
的签名中被提及,所以它必须与周围的类型相匹配。例如,这不起作用:
let w = WrappedFunction<string, bool>.Make (fun i -> i + 42)
^^^^^^
|
"The type 'int' does not match the type 'string'"
如果您希望CCD_;只是工作;在不指定类型参数的情况下,这里的通常模式是创建一个第二个类型,该类型具有相同的名称,但没有类型参数,并在其中放入方法:
type WrappedFunction<'a,'b> =
{
Function:'a -> 'b
}
type WrappedFunction =
static member public Make (f:'a -> int) = {Function = f}
static member public Make (f:'a -> string) = {Function = f}
当然,如果是这种情况,你就不能访问私有构造函数。