如何将一个类型参数限制为另一个

Dan*_*iel 20 f#

有没有办法约束一个类型参数从另一个派生?

type Foo<'T, 'U when 'U :> 'T> = 
    member x.Bar() : 'T = upcast Unchecked.defaultof<'U>
Run Code Online (Sandbox Code Playgroud)

此代码产生以下错误:

错误1无效约束:用于约束的类型是密封的,这意味着约束只能通过最多一个解决方案来满足

错误2此类型参数的使用方式将其限制为始终为"T"

错误3从类型'T到'T0的静态强制涉及基于此程序点之前的信息的不确定类型.某些类型不允许静态强制.需要进一步的类型注释.

警告4此构造使代码不如类型注释所指示的那样通用.类型变量'U已被约束为类型''T'.

kvb*_*kvb 23

No :(.这是目前F#中最不幸的限制之一(在我看来).请参阅规范的解决子类型约束条款,其中指出

表单类型的新约束:>'b再次解析为type ='b.

这真是一个耻辱,因为否则我们可以解决F#缺乏通用差异:

let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile
  s |> box |> unbox
Run Code Online (Sandbox Code Playgroud)

  • 发现它,它在这里:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3942302-provide-covariance-contravariance-language-support (2认同)