Активные шаблоны и ограничения членов
Для встроенной функции можно создать ограничение, например:
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()
участники.