How to constrain one type parameter by another

2019-01-05 04:09发布

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 constraint 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'.

标签: f#
1条回答
倾城 Initia
2楼-- · 2019-01-05 04:44

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
查看更多
登录 后发表回答