Как ограничить один параметр типа другим - PullRequest
18 голосов
/ 04 октября 2010

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

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 Ответ

21 голосов
/ 04 октября 2010

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

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

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

let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile
  s |> box |> unbox
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...