リスト内包表記とは簡単にリストを作り出す式であり、非常に強力です。
書式は
[構築子 || パターン <- リスト, 条件]
リストからパターンにマッチし、かつ条件を満たす要素に対して
構築子を適用したリストを返します。
となっています。
サンプルを見てましょう。
1> List = [1,2,3,4,5].
[1,2,3,4,5]
2> List2 = [X*2 || X <- List, X < 5].
[2,4,6,8]
「 パターン <- リスト 」の部分はジェネレータと呼ばれています。
「 条件 」はフィルタと呼ばれます。フィルタはなくても構いません。
ジェネレータとフィルタはいくつでも書くことが可能ですが、ジェネレータを複数書くと複雑な動作になってしまいます。
それでは、サンプルを通して学んでいきましょう。
1> List = [1,2,3,4,5].
[1,2,3,4,5]
2> Double = fun(X) -> X*2 end.
#Fun<erl_eval.6.13229925>
構築子(コンストラクタ)にfunを使用しています
3> [Double(X) || X <- List].
[2,4,6,8,10]
1> List = [1,2,apple,4,orange].
[1,2,apple,4,orange]
2> [2*X || X <- List].
** exception error: bad argument in an arithmetic expression
in operator */2
called as 2 * apple
条件を記述して整数のみ取り出しています。
3> [2*X || X <- List, is_integer(X)].
[2,4,8]
1> List = [{male,taro},{female,hanako},{female,kanae},
1>{male,sigeru},{male,tosihiko}].
[{male,taro},
{female,hanako},
{female,kanae},
{male,sigeru},
{male,tosihiko}]
パターンを使って{male,_}の要素のみを抜き出しています。
2> List2 = [X || {male,X} <- List].
[taro,sigeru,tosihiko]
コンストラクタに、タプルに値を埋め込ませています
3> List3 = [{man, X} || {male,X} <- List].
[{man,taro},{man,sigeru},{man,tosihiko}]