如何获得警告 FS1125(泛型类型 'xxx' 的实例化丢失且无法从中推断出来)消失?



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>,这也是可行的。

第二个类型参数'bMake的签名中没有提及,因此它不必匹配任何内容。但它仍然需要以某种方式被知道,因此需要明确指定。如果您没有明确指定它,就会收到警告。

有了第一个类型参数'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}

当然,如果是这种情况,你就不能访问私有构造函数。

相关内容

最新更新