F #: ограничения членов, чтобы помочь создать, казалось бы, динамические типы - PullRequest
3 голосов
/ 11 ноября 2011

Я искал способ добавить некоторую типизацию утки в метод F #.

SomeMethod(model:'a) =
   let someField = model.Test("")

Где для входящего параметра указан метод Test.Я видел такую ​​запись:

member inline public x.Testing< ^a when ^a : (member public Test : String-> String)>(model:^a) =   
  let something = model.Test("")
  ignore

Мне кажется, что общие ограничения могут использоваться для определения выше на уровне метода, а не на уровне класса / интерфейса.Проблема в том, что я не могу его скомпилировать из-за проблем с типом.Это заставляет меня поверить, что на уровне методов нет способа указать ограничения.Это правильно?

1 Ответ

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

Синтаксис этого немного неуклюж, но здесь он есть.

type Foo() =
  member inline public x.Testing(model) =   
    let something = (^a : (member Test : string -> string) (model, ""))
    ignore

Возможно, вам лучше использовать интерфейс:

type IModel
  abstract Test : string -> string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...