リスト内包表記

ふつけるだとリスト内包表記について1ページしか書かれていなかったのですが
関数プログラミング』ではけっこうくわしく書かれていて、
サンプルもいっぱい載ってるのでわかりやすいです。


ということで、お試しをいくつか書きます。



単純な1〜3の要素を持つリストの生成

[x | x <- [1..3]]
→ [1, 2, 3]


1〜10のリストから取り出したxで、偶数であるxに対してx * xしたリストの生成

[x * x | x <- [1..10], even x]
→ [4, 16, 36, 64, 100]


組み合わせのリスト生成

[(a, b) | a <- [1..3], b <- [1..2]]
→ [(1,1), (1,2), (2,1), (2,2), (3,1), (3,2)]


生成式の順番を変えるとこうなる

[(a, b) | b <- [1..2], a <- [1..3]]
→ [(1,1), (2,1), (3,1), (1,2), (2,2), (3,2)]


後ろの生成式が、前の生成式で導入した変数に依存することもありえる

[(i, j) | i <- [1..4], j <- [i+1..4]]
→ [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]


述語を生成式の間に自由にはさむこともできる

[(i, j) | i <- [1..4], even i, j <- [i+1..4], odd j]
→ [(2,3)]


内包表記の要素を表す式には、生成式で導入された変数を使用しなくてもいい

[3 | x <- [1..3]]
→ [3, 3, 3]
[x | x <- [1..3], y <- [1, 2]]
→ [1, 1, 2, 2, 3, 3]


リスト内包表記おもしろいなー。
慣れないと読めないですけど。