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」以降は戻り値のリストに含まれない。