Erlang Pattern Matching Order - PullRequest
       55

Erlang Pattern Matching Order

0 голосов
/ 29 июня 2018

Я написал простую функцию в Erlang, которая преобразует кортеж в список. Но я не понимаю, почему здесь важен порядок сопоставления с образцом:

* ** 1003 тысяча два * Пример
tupleToList(Tuple) -> tupleToList(Tuple, size(Tuple), []).
tupleToList(_, 0, L) -> L;
tupleToList(Tuple, S, L) -> tupleToList(Tuple, S - 1, [element(S, Tuple) | L]).

Почему приведенный ниже код неверен?

tupleToList(Tuple) -> tupleToList(Tuple, size(Tuple), []).
tupleToList(Tuple, S, L) -> tupleToList(Tuple, S - 1, [element(S, Tuple) | L]);
tupleToList(_, 0, L) -> L.

1 Ответ

0 голосов
/ 29 июня 2018

Потому что так работают функции в Erlang :

Если функция найдена, пункты функции сканируются последовательно до тех пор, пока не будет найдено предложение, которое удовлетворяет обоим из следующих двух условий:

  • Шаблоны в заголовке предложения могут быть успешно сопоставлены с заданными аргументами.
  • Защитная последовательность, если таковая имеется, является истинной.

Поскольку переменные совпадают со всеми, а защитная последовательность отсутствует, предложение tupleToList(Tuple, S, L) всегда выбирается во втором случае, прежде чем tupleToList(_, 0, L) когда-либо будет рассматриваться.

...