2014-11-08 2 views
-1

Im обучения Erlang предположим, у меня есть два спискаErlang Список Кортеж Match

[{a,a,a,b,c},{d,d,a,a,b},{a,b,c,d,e}] 
[{{a,a,a,a,a},10},{{a,a,a,a},6},{{a,a,a},4}] 

после Паттен матча, ожидаемый результат {а, а, а, Ь, с}, так как он может соответствовать {{а, а, а}, 4}

Я попытался списки: keysearch и списки: член, но не может получить ожидаемый результат

любое предложение?

спасибо

+0

Как '{a, a, a, b, c}' соответствует '{{a, a, a}, 4}'? Не могли бы вы объяснить, как эти два эти же? – mpm

+0

Благодарим вас за ответ. Я хочу сопоставить {a, a, a | _} {a, a, a, b, c}. Это возможно? – user3644708

+0

Все еще не уверен. Почему '{a, a, a, b, c}' не соответствуют '{{a, a, a, a, a}, 10}'? Кортежи обычно представляют собой какие-то целые связанные данные; если вы пытаетесь использовать только часть из них, возможно, попытайтесь представить его в виде списков? И для меня очень сложно придумать общий алгоритм, если я действительно не понимаю, что вы пытаетесь представить? Возможно, попробуйте описать логику вашего соответствия, откуда вы получаете свой вход, и где будете использовать свой вывод. Это может помочь мне немного. – mpm

ответ

2

Соответствие нецелевое. Ваша ментальная модель того, как работают сопоставления, путает операции набора (например, вычитание и пересечение множества) со сравнением и присваиванием. Вы также можете воспользоваться своей концепцией заданных операций.

Соответствие 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.

+0

спасибо, что ответите. не стесняйтесь редактировать вопрос. – user3644708

Смежные вопросы