Перепишите общий код C # в F #

Я пытаюсь переписать общий код, например this (C #):

U Upcast<T, U>(T x) where T : U { return x; }

В F #:

let ucast<'T, 'U when 'T :> 'U> (x: 'T) = x :> 'U

Но решение ограничений F # работает иначе, чем C #, и компилятор выводит кучу типографских ошибок:

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

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

ошибка FS0663: Этот параметр типа использовался таким образом, чтобы всегда был "U"

ошибка FS0013: Статическое приведение from type 'U to' U
включает неопределенный тип, основанный на информации, предшествующей этой программе . Статическое приведение не разрешено для некоторых типов. Требуются дополнительные аннотации типа .

ошибка FS0661: Одна или несколько переменных явного класса или типа функции для этой привязки не могут быть обобщены, поскольку они были {{1} } ограничены другими типами

Пожалуйста, объясните мне, как правильно переписать код C #, приведенный выше, и почему написанная мной версия F # не компилируется.

7
задан controlflow 30 December 2010 в 09:58
поделиться