Erlang World


top > sequential programming > list comprihension

List Comprihension

リスト内包表記

リスト内包表記とは簡単にリストを作り出す式であり、非常に強力です。

書式は

[構築子 || パターン <- リスト, 条件]

リストからパターンにマッチし、かつ条件を満たす要素に対して
構築子を適用したリストを返します。	

となっています。
サンプルを見てましょう。

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}]

Yuichi ITO. All rights reserved.
mail to : ad
inserted by FC2 system