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