Основная сила сопоставления с образцом не в смешном синтаксисе. Основная сила шаблонов в том, что они могут быть вложенными .
Взгляните на это:
match value with
| Foo (Bar, Baz [First 42; Second "hello!"]) -> "It's a thing"
| Qux [42; 42; 42] -> "Triple fourty-two"
| _ -> "No idea"
Предполагая, что все заглавные слова являются активными шаблонами, давайте попробуем переписать первый шаблон с помощью явного вызова convert
:
match convertFoo value with
| Foo (x, y) ->
match convertBar x, convertBaz y with
| (Bar, Baz [z1; z2]) ->
match convertFirst z1, convertSecond z2 with
| First 42, Second "hello!" -> "It's a thing"
Слишком долго и запутанно? Но подождите, нам даже не удалось написать все несоответствующие ветки!
match convertFoo value with
| Foo (x, y) ->
match convertBar x, convertBaz y with
| (Bar, Baz [z1; z2]) ->
match convertFirst z1, convertSecond z2 with
| First 42, Second "hello!" -> "It's a thing"
| _ -> "No idea"
| _ -> "No idea"
| Qux [42; 42; 42] -> "Triple fourty-two"
| _ -> "No idea"
Видите, как ветка «Без идеи» дублируется? Разве копирование и вставка не замечательно? : -)
Кстати, именно поэтому слабая попытка C # в том, что они имеют смелость называть «сопоставлением с образцом», на самом деле не является сопоставлением с образцом: она не может быть вложенной, и поэтому, как вы очень проницательно наблюдаете, она не лучше чем просто вызов функций классификатора.