将一些C#泛型代码重写为F#
我正试图像这样重写通用代码(C#):将一些C#泛型代码重写为F#,c#,generics,f#,C#,Generics,F#,我正试图像这样重写通用代码(C#): uupcast(tx),其中T:U{returnx;} 在F#中: 让ucast(x:'T)=x:>'U 但F#约束求解的工作原理与C#不同,编译器会输出一系列键入错误: 错误FS0698:无效约束:错误 用于约束的类型为 密封,这意味着约束 最多只能满足一个 解决方案 警告FS0064:此构造导致 代码的通用性要低于所示 通过类型注释。类型 变量“T”已被约束为 输入“U” 错误FS0663:此类型参数具有 以限制它的方式使用 永远是“你” 错误FS0
uupcast(tx),其中T:U{returnx;}
在F#中:
让ucast(x:'T)=x:>'U
但F#约束求解的工作原理与C#不同,编译器会输出一系列键入错误:
错误FS0698:无效约束:错误
用于约束的类型为
密封,这意味着约束
最多只能满足一个
解决方案
警告FS0064:此构造导致
代码的通用性要低于所示
通过类型注释。类型
变量“T”已被约束为
输入“U”
错误FS0663:此类型参数具有
以限制它的方式使用
永远是“你”
错误FS0013:来自的静态强制
键入“U到”U涉及不确定的基于类型的 关于本课程之前的信息 指向静态强制并不适用 在某些类型上允许。进一步类型 需要注释 错误FS0661:一个或多个 显式类或函数类型 无法找到此绑定的变量 可以概括,因为它们是 约束到其他类型
请告诉我如何正确重写上面的C代码,以及为什么我编写的F版本不能编译。这是编译器的限制。约束“a:>”b的正确类型必须是非泛型类型。不能为此编写类型安全函数。但是,您可以使用运算符而不是函数。这在F#中是不可能的。见和
U Upcast<T, U>(T x) where T : U { return x; }
let ucast<'T, 'U when 'T :> 'U> (x: 'T) = x :> 'U