Как ограничить один параметр типа другим
Есть ли способ ограничить один параметр типа, который должен быть получен из другого?
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'.
Ответы
Ответ 1
Нет:( Это одно из самых неудачных ограничений F # на данный момент (на мой взгляд). См. Решение ограничений подтипов раздел спецификации, в котором говорится, что
Новые ограничения типа формы: > 'b снова решаются как type =' b.
Это действительно позор, поскольку в противном случае мы могли бы обходиться без общей дисперсии F #:
let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile
s |> box |> unbox