Если бы обычные функции могли использоваться в качестве шаблонов, это избавило бы от необходимости писать тривиальные активные шаблоны, такие как
let (|NotEmpty|_|) s = Seq.tryPick Some s
и, гипотетически, разрешит
let s = seq []
match s with
| Seq.tryPick Some -> ...
| _ -> //empty
Это сделало бы функции более пригодными для повторного использования, избавив от необходимости «шаблонизировать» функции, которые вы хотите использовать с соответствием:
let f x = if x then Some() else None
let (|F|_|) = f
Я знаю, что активные шаблоны могут быть вызваны как функции, поэтому предыдущий пример можно упростить, определив шаблон only . Но отказ от специального синтаксиса шаблонов упрощает это.
Каковы причины специального синтаксиса?
EDIT
В дальнейшем активный шаблон затеняет литерал.
[<Literal>]
let X = 1
let (|X|_|) x = if x = 0 then Some() else None
match 0 with //returns true
| X -> true
| _ -> false
Почему это не работает и для вызовов функций в шаблонах?
РЕДАКТИРОВАТЬ 2
Я нашел сценарий, который был бы неоднозначным
let zero n = if n = 0 then Some() else None
match 0 with
| zero -> //function call or capture?
Это, на мой взгляд, проясняет, почему активный шаблон должен начинаться с заглавной буквы - это делает намерение более ясным и делает затенение, как в моем предыдущем примере, гораздо менее вероятным.