首页 文章

将一些C#通用代码重写为F#

提问于
浏览
7

我正在尝试重写这样的通用代码(C#):

U Upcast<T, U>(T x) where T : U { return x; }

在F#中:

let ucast<'T, 'U when 'T :> 'U> (x: 'T) = x :> 'U

但是F#约束求解的工作方式与C#不同,编译器会输出一堆输入错误:

错误FS0698:无效约束:用于约束的类型是密封的,这意味着约束只能通过最多一个解决方案警告FS0064来满足:此构造使代码不像类型注释所指示的那样通用 . 类型变量'T已被约束为类型''U' . 错误FS0663:此类型参数的使用方式将其限制为始终为“U”错误FS0013:从“U”到“U”类型的静态强制涉及基于此程序点之前的信息的不确定类型 . 某些类型不允许静态强制 . 需要进一步的类型注释 . 错误FS0661:此绑定的一个或多个显式类或函数类型变量无法一般化,因为它们被约束为其他类型

请解释一下如何正确地重写上面的C#代码以及为什么我编写的F#版本没有编译 .

3 回答

相关问题