無題の備忘録

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

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

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

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

sort/1 関数

sort(List1) -> List2

Types

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

List1 をソートしたリストを返す。

> lists:sort([5,2,4,3,1]).
[1,2,3,4,5]
> lists:sort([b,a,d,e,c]).
[a,b,c,d,e]
> lists:sort([{b,"B"},{c,"C"},{a,"A"},{d,"D"},{e, "E1", "E2"}, 1, a, {a}]).
[1,a,{a},{a,"A"},{b,"B"},{c,"C"},{d,"D"},{e,"E1","E2"}]

sort/2

sort(Fun, List1) -> List2

Types

Fun = fun((A :: T, B :: T) -> boolean())
List1 = List2 = [T]
T = term()

順序付け関数 Fun に従って、List1 をソートしたたリストを返す。 Fun(A, B)は、Aが順序でB以下である場合は true を返し、そうでない場合は false を返す。

> F = fun(A, B) -> A >= B end.
#Fun<erl_eval.12.99386804>
> lists:sort(F, [1,2,3,4,5]).
[5,4,3,2,1]
> lists:sort(F, [1,2,a,b,4,c,3,d,e,5]).
[e,d,c,b,a,5,4,3,2,1]

split/2 関数

split(N, List1) -> {List2, List3}

Types

N = integer() >= 0
0..length(List1)
List1 = List2 = List3 = [T]
T = term()

List1 を List2 と List3 に分割する。 List2 には最初の N 個の要素が含まれ、List3 には残りの要素(N番目の末尾)が含まれる。

> lists:split(3,[1,2,3,4,5,6,7,8,9]).  
{[1,2,3],[4,5,6,7,8,9]}
> lists:split(9,[1,2,3,4,5,6,7,8,9]). 
{[1,2,3,4,5,6,7,8,9],[]}
> lists:split(10,[1,2,3,4,5,6,7,8,9]).
** exception error: bad argument
     in function  lists:split/2
        called as lists:split(10,[1,2,3,4,5,6,7,8,9])
> lists:split(0,[1,2,3,4,5,6,7,8,9]). 
{[],[1,2,3,4,5,6,7,8,9]}

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

splitwith/2 関数

splitwith(Pred, List) -> {List1, List2}

Types

Pred = fun((T) -> boolean())
List = List1 = List2 = [T]
T = term()

リストの要素を1つづつ Pred 関数で検証して、List の要素が true である限りそれらの要素は List1 へ、false を返す要素が見つかるとそれ以降は List2 へ分割される。

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

sublist/2 関数

sublist(List1, Len) -> List2

Types

List1 = List2 = [T]
Len = integer() >= 0
T = term()

最初の要素から最大 Len 要素を持つ List1 のサブリストを返す。

> lists:sublist([1,2,3,4,5,6,7,8,9], 5).   
[1,2,3,4,5]
> lists:sublist([1,2,3,4,5,6,7,8,9], 15).
[1,2,3,4,5,6,7,8,9]
> lists:sublist([1,2,3,4,5,6,7,8,9], 0). 
[]
> lists:sublist([1,2,3,4,5,6,7,8,9], 1).
[1]

Len がリストの長さを超えてもエラーにはならず、リスト全体が返される。

sublist/3 関数

sublist(List1, Start, Len) -> List2

Types

List1 = List2 = [T]
Start = integer() >= 1
1..(length(List1)+1)
Len = integer() >= 0
T = term()

Start から始まる最大 Len 要素を持つ List1 のサブリストを返す。 Start + Len がリストの長さを超えてもエラーにはならない。

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

subtract/2 関数

subtract(List1, List2) -> List3

Types

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

List1 から List2 の要素を削除したリストを返す。ただし、List1 で最初に出現する要素しか削除されない。

> lists:subtract([1,2,3,4,5,1,2,3,4,5],[1,2,3,4]).  
[5,1,2,3,4,5]
> lists:subtract("Hello world!, Hello world!", "Hello"). 
" world!, Hello world!"

上記のいずれの例でも、List1 の最初の要素しか削除されていないことに注意する。

suffix/2 関数

suffix(List1, List2) -> boolean()

Types

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

List1 が List2 のサフィックスの場合は true を返し、それ以外の場合は false を返す。

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

sum/1 関数

sum(List) -> number()

Types

List = [number()]

List の要素の合計値を返す。

> lists:sum([1,2,3,4,5]).
15
> 
> lists:sum([1,2,3,4,5,a]).
** exception error: an error occurred when evaluating an arithmetic expression
     in function  lists:sum/2 (lists.erl, line 291)

List の要素は数値でなくてはならない。

takewhile/2 関数

takewhile(Pred, List1) -> List2

Types

Pred = fun((Elem :: T) -> boolean())
List1 = List2 = [T]
T = term()

Pred(Elem) が true を返す間、List1 から要素 Elem を取得してリストを返す。

> lists:takewhile(F, [a,b,c,1,2,3,d,e,4,5]).
[a,b,c]
> lists:takewhile(F, [1,2,3,4,5]).          
[]

1つ目の例では、「1」で Fun が false になるので、「1」以降は戻り値のリストに含まれない。