Функция f # define generi c для нескольких типов и перегруженных операторов - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь определить встроенную функцию, которая может выполнять арифметические c операции над несколькими типами - в том числе над пользовательскими типами - обобщенным образом c. Однако, похоже, что встроенная функция делает вывод о преждевременном выводе своего типа.

Мой пользовательский тип следующий:

type ^T Foo (x: ^T) =
    static member inline (*) (x: ^T, y: Foo< ^T>) = Foo x

, и вот как я хочу его использовать:

let foo = Foo 1

let F () = 1 * foo // works
let inline G x = 1 * x // G inferred as int -> int

let z1 = G 1 // works
let z2 = G foo // error: expected int not Foo

Каков наилучший способ написания обобщенных c функций, таких как G, при простоте?

1 Ответ

2 голосов
/ 13 апреля 2020

Проблема заключается в том, что вывод типа F # использует слабое разрешение:

let inline G x = 1 * x // G inferred as int -> int

То есть, при наличии бинарного оператора он использует свидетельство того, что один оператор является известным типом, чтобы сопоставить другой с тот же тип.

Это поведение может измениться в будущих версиях при наличии встроенного ключевого слова.

На данный момент стандартным способом написания вашей функции является использование обобщенного c one:

let inline G x = LanguagePrimitives.GenericOne * x
...