Erlang World


top > data type > list

List

リスト

この節ではリスト(list)を扱います。 Erlangにおけるリストの概念は他の言語のものとほとんど同じですが、 Erlangではリストを多用するため、きちんと概念を身につける必要があります。
リスト内包表記については別の章で取り扱います。

リストとは個数が決まっていないデータの集まりを格納する型です。
タプルは定まった数のデータを扱うのが得意なのに対し、リストはデータの追加といった制御を得意とします。

リストの書式は大括弧([])の中にコンマ(,)で区切ったタームを格納するという形です。

[Term1, . . . ,TermN]

例えば、

[lisp,fortran,ada,cobol]

[{good,erlang}, hello, [1, 2, 3]]

[]

のようなものです。[]は空のリストとなります。

また、Java等のリストと異なり、リスト内の型に一貫性は必要ありません。
好きな要素を好きなように入れることが可能です。

[hello,33,{apple,150},erlang]

のようなものでも大丈夫です。
しかし、上のようなリストは非常に利用し辛いものなので、 特定の用途(debug等)以外では複数の型を入れると言った利用の仕方はしないほうが良いと思います。

リストの使い方

まず、リストで使用する用語を覚えて下さい。

リストの先頭はヘッド(Head)と呼ばれます。
ヘッド以外の部分はテール(Tail)と呼ばれます。

例えば、リスト[a,b,c,d,e,f]では、ヘッドがaで、テールは2番目以降(b,c,d,e,f)となります。

この構造は[ H | T ]と表現でき、H が ヘッド で T が テール となります。
この表記を使ってリストの先頭を簡単に切り離したり、先頭に値を付け加えたりすることが可能です。

1> List = [1,2,3,4,5].
[1,2,3,4,5]

ヘッドの取り出し
2> [H | T] = List.
[1,2,3,4,5]
3> H.
1
4> T.
[2,3,4,5]

結合
5> List2 = [0 | List].
[0,1,2,3,4,5]

リストは先頭から最後尾まで鎖のように繋がっているというデータ構造です。 したがって、その構造上リストのヘッドには非常に効率よくアクセスできます。 逆に、後ろの方へ行けば行くほど、アクセスの効率が悪くなります。

自分でプログラムのデータ構造を決める際には、ヘッドに対する処理を行うような仕組みにすることが望ましいです。
例えば、要素をリストにどんどん追加していく場合は、後ろではなく前に追加していくべきだと思われます。 そしてそれを最後に関数を用いてひっくり返してあげれば、後ろに追加していったものと同じ形になります。

良く使うリスト操作

lists:reverse(List)
リストの反転を行なう
> lists:reverse([1,2,3,4]).
[4,3,2,1]
List1 ++ List2
lists:appned(List1, List2)
lists:appned(ListOfList)
リストの結合を行なう
> [1,2,3,4] ++ [5,6,7,8].
[1,2,3,4,5,6,7,8]

> lists:append([1,2,3,4],[5,6,7,8]).
[1,2,3,4,5,6,7,8]

> lists:append([ [1,2], [3,4], [5,6], [7,8] ]).
[1,2,3,4,5,6,7,8]
lists:reverse(List)
末尾要素の取り出しを行なう
> lists:last([1,2,3,hello,4,5]).
5

BIF:erlang リストの操作を行なう関数

length(List) -> int()
List = [term()]
Listの長さを返す。
> length([1,2,3,4,5,6,7,8,9]).
9
hd(List) -> term()
List = [term()]
リストListのヘッドを返す。Listが空であれば例外を投げる。
> hd([1,2,3,4,5]).
1
tl(List1) -> List2
List1 = List2 = [term()]
Listのテールを返す。Listが空であれば例外を投げる。
> tl([geesties, guilies, beasties]).
[guilies, beasties]
is_list(Term) -> bool()
Term = term()
Termがリストであればtrue、そうでなければfalseを返します。
> is_list([hello,erlang]).
true

BIF:erlang リストの型変換

list_to_atom(String) -> atom()
String = string()
リスト文字列をアトムに変換する
> list_to_atom("Erlang").
'Erlang'
> list_to_atom([30,430,hello]).
** exception error: bad argument
     in function  list_to_atom/1
        called as list_to_atom([30,430,hello])
atom_to_list(Atom) -> string()
Atom = atom()
Atomをリスト(文字列)に変換する。
> atom_to_list('Erlang').
"Erlang"
list_to_float(String) -> float()
String = string()
文字列を浮動小数点数に変換する。変換できないようなら例外が投げられる
> list_to_float("2.2017764e+0").
2.2017764
float_to_list(Float) -> string()
Float = float()
浮動小数点数をリストに変換する。
> float_to_list(7.0).
"7.00000000000000000000e+00"
list_to_integer(String) -> int()
String = string()
文字列を整数に変換する。変換できないようなら例外が投げられる。
> list_to_integer("123").
123
integer_to_list(Integer) -> string()
Integer = int()
整数を文字列に変換します。
> integer_to_list(77).
"77"
erlang:list_to_integer(String, Base) -> int()
String = string()
Base = 2..36
文字列を基数Baseの整数として変換し、それを10進数で表示する。
> erlang:list_to_integer("3FF", 16).
1023
erlang:integer_to_list(Integer, Base) -> string()
Integer = int()
Base = 2..36
10進数の整数を基数Baseに変換し、それを文字列とします。
> erlang:integer_to_list(1023, 16).
"3FF"
list_to_pid(String) -> pid()
String = string()
文字列をPidに変換する。デバッグ以外では用いないこと。
> list_to_pid("<0.4.1>").
<0.4.1>
pid_to_list(Pid) -> string()
Pid = pid()
Pidを文字列に変換する。デバッグ以外では用いないこと。
> Pid = spawn(fun() -> receive X -> X end end).
<0.59.0>
19> pid_to_list(Pid).
"<0.59.0>"
list_to_tuple(List) -> tuple()
List = [term()]
Listをタプルに変換する。
> list_to_tuple([share, ['Ericsson_B', 163]]).
{share, ['Ericsson_B', 163]}
tuple_to_list(Tuple) -> [term()]
Tuple = tuple()
Tupleをリストに変換する。
> tuple_to_list({share, {'Ericsson_B', 163}}).
[share,{'Ericsson_B',163}]

Yuichi ITO. All rights reserved.
mail to : ad
inserted by FC2 system