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