Многократное ограничение статического типа арности - PullRequest
5 голосов
/ 11 ноября 2010

Допустим, у меня есть набор векторных типов (а-ля XNA), и некоторые из них имеют статический член Cross:

type Vector3 =
  ...
  static member Cross (a : Vector3, b : Vector3) = new Vector3(...)

Я могу определить функцию cross и она компилируется:

let inline cross (x : ^T) (y : ^T) = (^T : (static member Cross : (^T * ^T) -> ^T) ((x,y)))

К сожалению, я не могу использовать его, и у меня появляется следующая ошибка:

let res = cross a b
                 ^

Член или объект конструктора Cross принимает 2 аргумента (ов), но здесь дается 1. Требуемая подпись - статический член Vector3.Cross: a: Vector3 * b: Vector3 -> Vector3

Возможно ли вообще? Спасибо за помощь!

1 Ответ

5 голосов
/ 11 ноября 2010

Вы поставили в скобки свою статическую подпись члена.Попробуйте вместо этого:

let inline cross (x : ^T) (y : ^T) = 
  (^T : (static member Cross : ^T * ^T -> ^T) (x,y))

Учитывая ваше определение, F # искал члена Cross, который принимает один аргумент типа кортежа.

...