Я стараюсь быть мягким ;-) Итак, главное в функциональном подходе - думать в терминах: что такое ввод? Что должно быть выведено? Нет ничего лучше, чем сравнивать i-й элемент с одним i + 1-м элементом. Это всегда должно быть целью, которая приведет к преобразованию данных. Даже пример Mazen Harake делает это. В этом примере есть функция, которая возвращает только элементы, за которыми следует то же значение, то есть фильтрует заданный список. Как правило, есть очень разные способы, как сделать похожую вещь, которая зависит от ее цели. List - это базовая функциональная структура, и вы можете делать с ней удивительные вещи, как показывает нам Lisp, но вы должны помнить, что это не массив.
Каждый раз, когда вам необходим доступ к повторяемому i-му элементу, это указывает на то, что вы используете неправильную структуру данных. Вы можете создавать различные структуры данных, формируя списки и кортежи в Erlang, которые могут лучше служить вашим целям. Поэтому, когда вы сталкиваетесь с проблемой сравнения i-го с i + 1-м элементом, вам следует остановиться и подумать. Какова цель этого? Вам нужно выполнить преобразование данных stream , как Mazen Harake , или вам нужен произвольный доступ? Если второе, вы должны использовать другую структуру данных (например, array ). Даже тогда вы должны думать о характеристиках вашей задачи. Если вы будете в основном читать и почти никогда не будете писать, вы можете использовать list_to_tuple(L)
, а затем читать, используя element/2
. Когда вам потребуется время от времени писать, вы начнете думать о разбиении его на несколько кортежей, и по мере того, как ваш коэффициент записи будет расти, вы получите реализацию array
.
Так что вы можете использовать lists:nth/2
, если вы будете делать это только один или несколько раз, но в коротком списке, и вы не помешаны на производительности, как я. Вы можете улучшить его, используя [X1,X2|_] = lists:nthtail(I-1, L)
(L = lists:nthtail(0,L)
работает как положено). Если вы сталкиваетесь с большими списками и хотите многократно звонить, вам нужно переосмыслить свой подход.
P.S .: Есть много других интересных структур данных, кроме списков и деревьев. Молнии например.