Активные шаблоны и ограничения членов - PullRequest
12 голосов
/ 03 сентября 2011

Для встроенной функции можно создать ограничение типа:

let inline implicit arg =
  ( ^a : (static member op_Implicit : ^b -> ^a) arg)

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

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

Ответы [ 2 ]

29 голосов
/ 03 сентября 2011

Похоже, что вы также можете написать действующие шаблоны.Я не использовал это раньше, но я попробовал это сейчас, и, кажется, работает просто отлично.Шаблон Test ниже можно использовать с любым объектом, который реализует метод Test, который возвращает option< ^R >:

let inline (|Test|_|) (a:^T) : option< ^R > =
  (^T : (member Test : unit -> option< ^R >) a)

Теперь вы можете определить некоторые объекты, которые определяют метод Test, и сопоставить их, используяpattern:

type A() =
  member x.Test() = Some(10)

match new A() with
| Test(n) -> printfn "%d" n
| _ -> printfn "failed"

Это выглядит очень интересной техникой, потому что сопоставление с образцом теперь является частью объекта.

0 голосов
/ 03 сентября 2011

Я думаю, вам нужно использовать отражение, например Имейте функцию, которая принимает o:obj, а затем отражает более o.GetType() членов.

...