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

时间:2010-10-04 17:08:29

标签: f#

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

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 个答案:

答案 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
相关问题