Подтвердить что ты не робот

Добавить новый элемент в список

Я пытался добавить новый элемент в список следующим образом:

iex(8)> l = [3,5,7,7,8] ++ 3
[3, 5, 7, 7, 8 | 3]
iex(9)> l
[3, 5, 7, 7, 8 | 3]

Почему я попал на 5-ю позицию, например

8 | 3

Что это значит?
И как я могу добавить новый элемент в список?

-------- Обновление --------
Я пытаюсь зациклить список следующим образом:

iex(2)> l = [1,2] ++ 3
[1, 2 | 3]
iex(3)> Enum.each(l, fn(x) -> IO.puts(x) end)
1
2
** (FunctionClauseError) no function clause matching in Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:604: Enum."-each/2-lists^foreach/1-0-"(#Function<6.54118792/1 in :erl_eval.expr/5>, 3)
    (elixir) lib/enum.ex:604: Enum.each/2

Так как указатель числа 2 не указывает на список, а на значение 3, как я могу зацикливать список?

4b9b3361

Ответ 1

Оператор ++ предназначен для конкатенации двух списков, а затем, возможно, вы хотите добавить новый элемент, чтобы поместить его в список. Тогда, я думаю, вы должны добавить 3 в другой список:

iex (2) > l = [3,5,7,7,8] ++ [3]

[3, 5, 7, 7, 8, 3]

Ответ 2

Просто следуйте документам Elixir, чтобы добавить элемент в список (и сохранить производительность в виду =)):

iex> list = [1, 2, 3]
iex> [0 | list]   # fast
[0, 1, 2, 3]
iex> list ++ [4]  # slow
[1, 2, 3, 4]

https://hexdocs.pm/elixir/List.html

Ответ 3

Сначала: [1, 2 | 3] является обозначением неправильного списка.

Вторые: Чтобы сделать Enum.each, который вы пытаетесь сделать с неправильным списком, код будет выглядеть следующим образом:

Соответствие соответствующим/неправильным спискам соответственно легко. Таким образом, функция длины len для правильных списков:

len ([_ | T]) → 1 + len (T); len ([]) → 0. где мы явно сопоставляем завершение []. Если данный неправильный список будет генерировать ошибка. В то время как функция last_tail, которая возвращает последний хвост список может обрабатывать и неправильные списки:

last_tail ([_ | T]) → last_tail (T); last_tail (Хвост) → Хвост.
% Будет соответствовать любому хвосту

Это, конечно, код Erlang из @rvirding. Переведенный в Elixir и переведенный для печати, которую вы даете в своем примере, это будет выглядеть так:

iex(6)> defmodule T do
...(6)>   defp print([h|t]) do
...(6)>     IO.puts(h)
...(6)>     print(t)
...(6)>   end
...(6)>   defp print(t) do
...(6)>     IO.puts(t)
...(6)>   end
...(6)>   def print_improper_list(il), do: print(il)
...(6)> end
iex:6: warning: redefining module T
{:module, T,
 <<70, 79, 82, 49, 0, 0, 5, 136, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 161, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
 {:print_improper_list, 1}}
iex(7)> T.print_improper_list([1,2,3|4])
1
2
3
4
:ok

Я оставляю это как упражнение для вас, чтобы выяснить, как это сделать с помощью Enum.each.

Ответ 4

"I" означает, что список делится на голову и хвост так [head | хвост]. Если шаблон совпадает с списком таким образом, вы можете управлять обеими частями списка и использовать оператор ++ для конкатенации.