How to constrain one type parameter by another
Is there a way to constrain one type parameter to be derived from another?
type Foo<'T, 'U when 'U :> 'T> =
member x.Bar() : 'T = upcast Unchecked.defaultof<'U>
This code produces the following errors:
Error 1 Invalid constraint: the type used for the constra开发者_运维技巧int is sealed, which means the constraint could only be satisfied by at most one solution
Error 2 This type parameter has been used in a way that constrains it to always be ''T'
Error 3 The static coercion from type 'T to 'T0 involves an indeterminate type based on information prior to this program point. Static coercions are not allowed on some types. Further type annotations are needed.
Warning 4 This construct causes code to be less generic than indicated by the type annotations. The type variable 'U has been constrained to be type ''T'.
No :(. This is one of the most unfortunate limitations of F# at the moment (in my opinion). See the Solving Subtype Constraints section of the spec, which states that
New constraints of the form type :> 'b are solved again as type = 'b.
This is really a shame since otherwise we could work around F#'s lack of generic variance:
let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile
s |> box |> unbox
精彩评论