В чем суть активных паттернов? - PullRequest
9 голосов
/ 11 июня 2019

Когда мы сопоставляем шаблон по значению, используя Активные шаблоны , неявно вызывается функция «преобразования».Поэтому вместо того, чтобы писать:

match value with
| Tag1 -> ...
| Tag2 -> ...

Я могу явно написать:

match convert value with
| Tag1 -> ...
| Tag2 -> ...

Таким образом, мне не нужно использовать активные шаблоны здесь.Конечно, я должен явно вызвать функцию convert и явно объявить тип объединения.Но это мелочи для меня.

Так в чем же суть активных паттернов?

1 Ответ

14 голосов
/ 11 июня 2019

Основная сила сопоставления с образцом не в смешном синтаксисе. Основная сила шаблонов в том, что они могут быть вложенными .

Взгляните на это:

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 # в том, что они имеют смелость называть «сопоставлением с образцом», на самом деле не является сопоставлением с образцом: она не может быть вложенной, и поэтому, как вы очень проницательно наблюдаете, она не лучше чем просто вызов функций классификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...