無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

Erlang の lists モジュールを一通り試す - その5

最近、Erlang のコードを読んでいて、lists:any という関数が出てきたのだが、知らなかったので調べた。ついでに、他の関数も一通り眺めておく。

公式URL: http://erlang.org/doc/man/lists.html

min/1 関数

min(List) -> Min

Types

List = [T, ...]
Min = T
T = term()

リスト内の要素同士を比較して、その最小値の要素を返す。

> lists:min([1,2,3,4,5]).
1
> lists:min([a,b,c,d,e]).
a
> lists:min([ax,bx,cx,dx,ex]).
ax
> lists:min(["ax","bx","cx","dx","ex"]).
"ax"
> lists:min([{a, "A"},{b,"B"},{c,"C"},{d, "D"},{e, "E"}]).
{a,"A"}
> lists:min([{a, "A", "AA"},{b,"B"},{c,"C"},{d, "D"},{e, "E"}]).
{b,"B"}
> lists:min([{a, "A", "AA"},{b,"B"},{c,"C"},{d, "D"},5, e, [1,2,3,4,5]]).
5

数値だけではなく、term() について比較が定義されているので、上記のような要素でも最小値を得られる。max/1 関数を参照する。

nth/2 関数

nth(N, List) -> Elem

Types

N = integer() >= 1
1..length(List)
List = [T, ...]
Elem = T
T = term()

List の N 番目のリストを返す。

> lists:nth(3, [a, b, c, d, e]).
c

nthtail/2 関数

nthtail(N, List) -> Tail

Types

N = integer() >= 0
0..length(List)
List = [T, ...]
Tail = [T]
T = term()

N + 1 番目の要素からリストの最後までのリストを返す。

> lists:nthtail(3, [a, b, c, d, e]).
[d,e]
> lists:nthtail(1, [a, b, c, d, e]).
[b,c,d,e]
> lists:nthtail(0, [a, b, c, d, e]).
[a,b,c,d,e]
> lists:nthtail(5, [a, b, c, d, e]).
[]
> lists:nthtail(6, [a, b, c, d, e]).
** exception error: no function clause matching lists:nthtail(1,[]) (lists.erl, line 180)

リストの長さよりも大きい数値を N に指定すると、function_clause でクラッシュする。

partition/2 関数

partition(Pred, List) -> {Satisfying, NotSatisfying}

Types

Pred = fun((Elem :: T) -> boolean())
List = Satisfying = NotSatisfying = [T]
T = term()

リストを2つのリストに分割します。最初のリストには Pred(Elem) が true を返すすべての要素が含まれ、2番目のリストには Pred(Elem) が false を返すすべての要素が含まる。

> F = fun(X) -> is_atom(X) end.
#Fun<erl_eval.6.99386804>
> lists:partition(F, [1,2,3,4,5,a,b,c,d,e]).
{[a,b,c,d,e],[1,2,3,4,5]}

上記の例は、atomかどうかリストを分割する例。atomであるものは最初のリストに含まれ、そうでないものは2番目のリストに含まれる。

prefix/2 関数

prefix(List1, List2) -> boolean()

Types

List1 = List2 = [T]
T = term()

List1 が List2 のプレフィックスである場合は true、そうでない場合は false を返す。

> lists:prefix("Hello", "Hello world!").         
true
> lists:prefix("Hello", "Hollo world!").
false

上記は、文字列の例だが、Erlangでは文字列は整数のリストなので、listsモジュールで扱うことができる。

reverse/1 関数

reverse(List1) -> List2

Types

List1 = List2 = [T]
T = term()

List1の要素を逆順に並べたリストを返す。

> lists:reverse([1,2,3,4,5]). 
[5,4,3,2,1]

reverse/2 関数

reverse(List1, Tail) -> List2

Types

List1 = [T]
Tail = term()
List2 = [T]
T = term()

List1の要素を逆順に並べ、末尾に Tail を追加したリストを返す。

>lists:reverse([1, 2, 3, 4], [a, b, c]).
[4,3,2,1,a,b,c]

search/2 関数

search(Pred, List) -> {value, Value} | false

Types

Pred = fun((T) -> boolean())
List = [T]
Value = T

リストの要素 T = Value について、Pred(Value) が true を返す場合、最初の値に対して {valueValue} を返し、そうでない場合は false を返す。

> F = fun(X) -> is_atom(X) end.
#Fun<erl_eval.7.126501267>
> lists:search(F,[1,2,3,4,5,a,b,c,d,e]).
{value,a}

seq/2, seq/3 関数

seq(From, To) -> Seq
seq(From, To, Incr) -> Seq

Types

From = To = Incr = integer()
Seq = [integer()]

Fromで始まり、Toに到達するまで Incr を前の要素に追加した整数のリスト返す。

>  lists:seq(1, 10).
[1,2,3,4,5,6,7,8,9,10]
> lists:seq(1, 13, 3).
[1,4,7,10,13]