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

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

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

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

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

2 ответа

Решение

Похоже, что вы также можете написать действующие шаблоны. Я не использовал это раньше, но я попробовал это сейчас, и, кажется, работает нормально. 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"

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

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

Другие вопросы по тегам