Соответствие нецелевое. Ваша ментальная модель того, как работают сопоставления, путает операции набора (например, вычитание и пересечение множества) со сравнением и присваиванием. Вы также можете воспользоваться своей концепцией заданных операций.
Соответствие Erlang равно только для назначения и утверждения (своего рода сравнение). Если мы сопоставляем несвязанный переменную (никогда не использовали ранее) против любого значения, то переменная будет связан (назначен), что значение:
Foo = {a,b,c}.
Теперь Foo
и {a,b,c}
могут быть использованы как взаимозаменяемые. Это чисто символическое присваивание, как в математическом классе, а не «переменная» в смысле других языков, где переменными являются «ящики для хранения значений».
Если мы используем оператор =
против любого значения, и этот связанный теперь символ Foo
, мы делаем контрольное сравнение (утверждение), а не задание. Foo
не может ничего, кроме {a,b,c}
в данном контексте означает, таким образом пытаясь присвоить любое другое значение вызывает исключение, а просто о том, что {a,b,c}
является {a.b.c}
правильно и по-прежнему дает {a,b,c}
(и так Foo
теперь символ {a,b,c}
это может появляться с обеих сторон, и все же утверждение корректно).
Ведение
{a,b,c} = {a,b,c}.
или
{a,b,c} = Foo.
или
Foo = {a,b,c}.
возвращается {a,b,c}
, и не вызывает исключение, потому что все, что мы сделали здесь было утверждать что {a,b,c}
действительно {a,b,c}
.
Если я хочу только первое значение, присвоенное, я могу соответствовать другому:
{Bar,_,_} = {a,b,c}.
Теперь Bar
представляет a
, а _
значения игнорируются (полностью пропущен). Оригинал {a,b,c}
имеет не был изменен.Это также верно, если мы делаем:
{_,Baz,_} = Foo.
Теперь Baz
представляет b
и Foo
до сих пор представляет {a,b,c}
. И это все. Когда речь идет о списках, как [{a,b,c}, {1,2,3}]
мы все еще можем сделать согласование, но из-за природы списков мы будем проверять кусок в то время (попробуйте это в переводчика):
Spam = [{a,b,c}, {1,2,3}].
[Boo | _] = [{a,b,c}, {1,2,3}].
Теперь Boo
представляет {a,b,c}
и Spam
еще представляет его первоначальный список.
Это примерно все есть подходит. Волшебная вещь, связанная с сопоставлением шаблонов Эрланга, заключается не в том, как она работает, сколько в ней есть естественные возможности для сопоставления шаблонов, и как это естественным образом устраняет огромное количество проблем, требующих процедурных проверок или операций прямого назначения на других языках (cond, функциональные параметры, =
, сообщение прием и т.п.).
Операции с множеством и списками - это не то же самое, что соответствие шаблонов в Erlang. Я предлагаю сначала изучить некоторые базовые учебные материалы, как некоторые из многих хороших учебников для начинающих и Learn You Some Erlang.
Как '{a, a, a, b, c}' соответствует '{{a, a, a}, 4}'? Не могли бы вы объяснить, как эти два эти же? – mpm
Благодарим вас за ответ. Я хочу сопоставить {a, a, a | _} {a, a, a, b, c}. Это возможно? – user3644708
Все еще не уверен. Почему '{a, a, a, b, c}' не соответствуют '{{a, a, a, a, a}, 10}'? Кортежи обычно представляют собой какие-то целые связанные данные; если вы пытаетесь использовать только часть из них, возможно, попытайтесь представить его в виде списков? И для меня очень сложно придумать общий алгоритм, если я действительно не понимаю, что вы пытаетесь представить? Возможно, попробуйте описать логику вашего соответствия, откуда вы получаете свой вход, и где будете использовать свой вывод. Это может помочь мне немного. – mpm