Подтвердить что ты не робот

Как ограничить один параметр типа другим

Есть ли способ ограничить один параметр типа, который должен быть получен из другого?

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

Этот код вызывает следующие ошибки:

Ошибка 1 Недопустимое ограничение: тип, используемый для ограничения, запечатан, что означает, что ограничение может удовлетворяться только одним решением

Ошибка 2 Этот параметр типа использовался таким образом, чтобы он всегда был "T"

Ошибка 3 Статическое принуждение от типа "T to" T0 включает неопределенный тип, основанный на информации до этой точки программы. Статические принуждения не допускаются к некоторым типам. Необходимы дополнительные аннотации типов.

Предупреждение 4 Эта конструкция заставляет код быть менее общим, чем указано аннотациями типа. Переменная типа 'U была ограничена типом' 'T'.

4b9b3361

Ответ 1

Нет:( Это одно из самых неудачных ограничений F # на данный момент (на мой взгляд). См. Решение ограничений подтипов раздел спецификации, в котором говорится, что

Новые ограничения типа формы: > 'b снова решаются как type =' b.

Это действительно позор, поскольку в противном случае мы могли бы обходиться без общей дисперсии F #:

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