erlang 第6回 リスト内包表記

リスト内包表記

  • map等を使わずにリストを作り出す方法
  • [ F(X) || X <- List]と書く

簡単に使ってみる。

1> List = [1,4,6,8,19,20.0].
[1,4,6,8,19,20.0]
2> [X * 2 || X <- List].
[2,8,12,16,38,40.0]
3> List2 = [{hoge, 23}, {hoge, 50} | List].
[{hoge,23},{hoge,50},1,4,6,8,19,20.0]
4> [X * 10 || {hoge, X} <- List2].
[230,500]

[ F(X) || X <- List]は一般化すると[ 式 || 限定子1, 限定子2, ...]となる

  • 限定子:qualifier
    • ジェネレータもしくはフィルタが指定できる
    • X <- Listがジェネレータ
5> [X * 10 || {hoge, X} <- List2, X > 300].

6> [X * 10 || {hoge, X} <- List2, X > 30].
[500]
7> [X * 10 || {hoge, X} <- List2, X > 30, X < 60].
[500]
8> [X * 10 || {hoge, X} <- List2, X > 30, X < 40].

おぉ〜これは読みやすい。
今回は少なめ。ビル酔いでしんどいので。
spawn遠いなぁ・・・共有ETSテーブルとか、共有DETSテーブルとか、wktkするのに。

オマケ

この時に作ったcalculationを使ってみた。

1> List = [{add, 10, 20}, {sub, 50, 10}, {sum, 10}].
[{add,10,20},{sub,50,10},{sum,10}]
2> lists:map(fun(X) -> calculation:calc(X) end, List).
[30,40,55]
3> [calculation:calc(X) || X <- List].
[30,40,55]

ほほー。