首页 文章

如何将一个类型参数约束为另一个

提问于
浏览
18

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

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

此代码产生以下错误:

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

1 回答

  • 21

    No :( . 这是目前F#中最不幸的限制之一(在我看来) . 请参阅规范的Solving Subtype Constraints部分,其中指出

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

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

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

相关问题