Активные шаблоны и ограничение членов

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

Думаю, вам придется использовать отражение, например. Возьмите функцию, которая принимает o:obj, а затем отразите элементы o.GetType().