ふつけるだとリスト内包表記について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]
リスト内包表記おもしろいなー。
慣れないと読めないですけど。