List comprehension
List comprehensionとかいう耳慣れない機能を発見したので使ってみます。
これを使うと、
- 各要素を処理した結果リストの作成(rubyのArray#map!みたいなこと)
- 条件を満たす要素での絞り込み(rubyのArray#reject!みたいなこと)
- リスト同士の総当たりによるリストの生成
が簡単にできます。
形式
次の形式で書きます。
[ <処理> || <パターン> <- <リスト生成式>, <フィルタ式>... ].
サンプル
各要素を処理した結果リストの作成
配列の各要素を2倍した要素を作ります。
> [ X*2 || X <- [1,2,3,4] ]. [2,4,6,8]
条件を満たす要素での絞り込み
偶数のみに絞り込み。
> [ X || X <- [1,2,3,4], X rem 2 == 0 ]. [2,4]
総当たりリストの生成
二つのリストの積集合を取得します
> [ {X,Y} || X <- [1,2,3,4], Y <- [10,20,30] ]. [{1,10}, {1,20}, {1,30}, {2,10}, {2,20}, {2,30}, {3,10}, {3,20}, {3,30}, {4,10}, {4,20}, {4,30}]
組み合わせたサンプル
二つのリストの組み合わせのうち、値の積が3の倍数となるもののリストを作成します。
> [ {X,Y} || X <- [1,2,3,4], Y <- [10,20,30], X*Y rem 3 == 0 ]. [{1,30},{2,30},{3,10},{3,20},{3,30},{4,30}]