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 を返す場合、最初の値に対して {value、Value} を返し、そうでない場合は 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]