2016-02-20 18 views
21

をリストに新しい要素を追加します。は、私は次のようにリストに新しい要素を追加しようとしていた

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

は、なぜ私はそれがどういう意味

8 | 3 

などの5位になりましたか?
リストに新しい要素を追加するにはどうすればよいですか?

-------- 更新 --------
私はループに次のようにリストしてみてください。番号2のポインタではないので

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 

をリストを指すのではなく、値3にすると、どのようにリストをループできますか?

+0

Googleの "エリクシール不適切なリスト" のために。その表記法は不適切なリストを示しています。 –

答えて

25

++演算子は2つのリストを連結するためのもので、新しい要素を追加するために何をしたいかは、リスト内に置くことです。

IEX(2)> L = [3,5,7,7,8] ++ [3]

[3:その後、私はあなたが別のリストにを追加すべきだと思います、5,7,7,8,3]

+0

しかし、私は '8 | 3? –

+2

エリクサーのリストはリンクされたリストです。 A | Bは、セルAのポインタがBを指していることを意味します。あなたの場合、リストの最後の要素が3を格納する要素を指していることを意味します。 –

+4

@SalvadorMedinaいいえ、この場合 '8 | 3 'は不適切なリストを示す。 Googleの "Elixir不適切なリスト"とそれが何であるかがわかります。 –

-4

"I"はリストが頭と尾のように分割されていることを意味します。尾]。リストのパターンをこのようにパターン化すると、リストの両方の部分を操作し、連結のために++演算子を使用できます。

5

最初に:[1,2、 3]はimproper listの表記です。

第二:

適切/不適切なリストに対してマッチングが相応に簡単です:あなたは、コードは次のようになり、不適切なリストをどうしようとしているEnum.eachをすることができません。したがって、適切なリストの場合、 長さ関数len:

len([_ | T]) - > 1 + len(T); len([]) - > 0.終了する[]を に明示的にマッチさせます。不適切なリストが与えられた場合、 というエラーが生成されます。 リストの最後のテールを返す関数last_tailは不適切なリストも処理できますが、

last_tail([_ | T]) - > last_tail(T); last_tail(テール)→テール。
%は、当然のことながら、Erlang code from @rvirdingある任意の尾

と一致します。エリクサーに翻訳し、あなたの例で与える印刷を行うために翻訳され、それは次のようになりたい:

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であることを行う方法を把握するため。

18

だけ(=と心の中でパフォーマンスを保つ)リストに要素を追加するためにエリクサーのドキュメントに従ってください):

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

+4

Elixir/Erlangのリストは内部的にリンクされたリストなので、リストの先頭に追加するとリストの末尾にあるリンクを再作成する必要がないため、高速で操作できます。したがって、リストの末尾に要素を追加すると、リンクされたリストは、すべてのリンクを先頭から最後まで再作成する必要があります。 –

+0

リンクリストに要素を追加することは、計算上高価になる可能性があることを理解していませんでした。このスニペットを見るまで、プリペンドは安かったが、リストの基礎となるコンスセルが表示されていた。 'iex> [1 | [2 | [3 | []]]] [1,2,3] ' –

関連する問題