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


Я пытаюсь переписать общий код вот так (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: эта конструкция вызывает код должен быть менее общим, чем указано по типу аннотации. Тип переменная ' T была ограничена быть типа "у'.

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

Ошибка FS0013: статическое принуждение от типа 'У 'у
включает неопределенный тип на основе Об информации, предшествующей этой программе точка. Статического давления не допускается на некоторых типах. Далее тип нужны аннотации.

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

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

3 7

3 ответа:

Для этого нельзя написать типобезопасную функцию. Вы могли бы, однако, использовать upcast оператор вместо вашей функции.

Это ограничение компилятора. Правый тип ограничения 'a : >' b должен быть не универсального типа.