如何消除FS1125警告?Don Syme的建议在此场景不适用
解决FS1125泛型实例化缺失警告的方案
我来帮你搞定这个FS1125警告的问题!首先咱们先搞清楚为啥会出现这个警告:你定义的WrappedFunction有两个重载的Make方法,分别接受返回int和string的函数。当你调用WrappedFunction.Make (fun (a:DateTime) -> a.ToString())时,虽然lambda的参数是DateTime、返回值是string,但F#的类型推断在处理重载的泛型方法时,没办法完全确定泛型参数'a的具体类型(哪怕看起来很明显),所以就抛出了这个警告。
下面给你几个实用的解决办法:
方法1:显式指定泛型参数
最直接的方式就是在调用Make的时候,明确告诉编译器泛型参数'a的类型:
let a = WrappedFunction.Make<DateTime> (fun a -> a.ToString())
这样编译器就不用再费劲推断'a了,警告自然就消失了。
方法2:给Make方法添加类型约束(调整定义)
如果你不想每次调用都显式写泛型参数,可以修改WrappedFunction的定义,给Make方法加上更明确的类型约束,帮助编译器缩小推断范围:
type WrappedFunction<'a,'b> = private { Function:'a -> 'b } static member Make (f:'a -> int) = {Function = f} static member Make (f:'a -> string) = {Function = f} // 添加一个泛型版本,让编译器更容易匹配 static member Make<'a, 'b when 'b :> obj> (f:'a -> 'b) = {Function = f}
不过这个方法可能会影响重载的优先级,需要根据你的实际场景调整。
方法3:避免重载,改用不同命名的方法
如果重载不是必须的,你可以把两个Make方法改成不同的名字,比如MakeInt和MakeString,这样编译器就不会有歧义了:
type WrappedFunction<'a,'b> = private { Function:'a -> 'b } static member MakeInt (f:'a -> int) = {Function = f} static member MakeString (f:'a -> string) = {Function = f} // 调用时直接用明确的方法名 let a = WrappedFunction.MakeString (fun (a:DateTime) -> a.ToString())
这些方法里,我最推荐方法1,简单直接,而且不会改变你原有的类型定义结构。
内容的提问来源于stack exchange,提问作者Chechy Levas
相关产品推荐
相关产品推荐

