Вы также можете написать это более кратко с помощью Option.bind
, но это хорошо подходит для сопоставления с образцом.
Мы можем определить активный образец для сопоставления IComparable
.
let (|IsComparable|) (obj : obj) =
match obj with
| :? IComparable as comparable -> Some(comparable)
| _ -> None
F # позволяет использовать активные шаблоны в привязках let
, чтобы более четко передать смысл функции.
let compare (IsComparable o1) (IsComparable o2) =
match (o1, o2) with
| (Some o1, Some o2) when
o1.GetType() = o2.GetType() -> Some(o1.CompareTo(o2))
| _ -> None
Это также может быть сжато (без активной шаблон - @kaefer):
let compare (o1 : obj) (o2: obj) =
match (o1, o2 ) with
| (:? System.IComparable as o1), (:? System.IComparable as o2) when
o1.GetType() = o2.GetType() -> Some(o1.CompareTo(o2))
| _ -> None