有没有办法约束一个类型参数从另一个派生?
type Foo<'T, 'U when 'U :> 'T> =
member x.Bar() : 'T = upcast Unchecked.defaultof<'U>
此代码产生以下错误:
错误1无效约束:用于约束的类型是密封的,这意味着约束只能通过最多一个解决方案来满足
错误2此类型参数的使用方式将其限制为始终为“T”
错误3从类型'T到'T0的静态强制涉及基于此程序点之前的信息的不确定类型。某些类型不允许静态强制。需要进一步的类型注释。
警告4此构造导致代码不如类型注释所指示的那样通用。类型变量'U被约束为类型''T'。
答案 0 :(得分:21)
否:(。这是目前F#中最不幸的限制之一(在我看来)。请参阅规范的Solving Subtype Constraints部分,其中说明
表单类型的新约束:&gt; 'b再次被解决为type ='b。
这真是一种耻辱,因为否则我们可以解决F#缺乏通用差异的问题:
let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile
s |> box |> unbox