Как я могу определить перегруженные операторы с операндами, определения типов которых я не контролирую в F #? - PullRequest
5 голосов
/ 31 мая 2019

У меня есть 3 типа, A, B и C в F #. Два типа, A и B У меня нет возможности изменять код для. Тип C - это тип, которым я управляю.

Я могу написать перегруженные операторы, такие как -

type C () =
    static member (><) (alpha : A) (beta : B) : C = zeta alpha beta
    static member (><) (beta : B) (alpha : A) : C = omega alpha beta

Когда я пытаюсь вызвать оператор, компиляция выдает следующую ошибку -

Error FS0043 None of the types 'A, B' support the operator '><'

Как я могу обойти проблему так, чтобы я мог определить перегруженные операторы с операндами, определения типов которых я не контролирую? Единственный тип, определением которого я управляю, является типом результата, C!

1 Ответ

6 голосов
/ 31 мая 2019

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

должны включать C и определять оператора на глобальном уровне:

type A = A
type B = B

type C () = class end

let zeta  _ _ = C ()
let omega _ _ = C ()

type C with
    static member (><) (_:C, alpha : A) = fun (beta  : B) -> zeta alpha beta : C
    static member (><) (_:C, beta  : B) = fun (alpha : A) -> omega alpha beta: C

let inline (><) x y = (Unchecked.defaultof<C> >< x) y

// Test
let x = A >< B
// val x : C

Примечание: вы можете использовать другое имя оператора внутри, если хотите

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