読者です 読者をやめる 読者になる 読者になる

Pseudo Engineer

ソフトウェアの話とか書いてくよ

Haskell道 その3

リスト内包表記

リストに対してフィルタリング・変換・組み合わせの処理を行える。

奇数を得るならこんな感じ。

let odds = [x | x <- [1..100], odd x]

カンマ区切りで条件(すなわちフィルタリング)を追加できる。

let oddsNotMulti5 = [x | x <- [1..100], odd x, x `mod` 5 /= 0]

リストのリストを処理するのに内包表記を入れ子にする。

let numLists = [[1,2,3], [5,6,7], [8,9,0]]
[ [x | x <- list, even x] | list <- numLists]
 -> [[2],[6],[8,0]]

リストを二乗する関数を作りたいなら、

let squares xs = [x * x | x <- xs]
squares [1,2,3,4,5]
 -> [1,4,9,16,25]

2つのリストの数値を文字列として結合。

[ show x ++ show y | x <- [1..4], y <- [9,8,7,6,5] ]
 -> ["19","18","17","16","15","29","28","27","26","25","39","38","37","36","35","49","48","47","46","45"]

次は、3つの値がa + b = cとなる整数の組み合わせを探すとするとこう書ける。

[ (a, b, c) | c <- [1..5], a <- [1..c], b <- [1..a], a + b == c]
 -> [(1,1,2),(2,1,3),(2,2,4),(3,1,4),(3,2,5),(4,1,5)]

ここでaの範囲は[1..c]、bの範囲は[1..a]となっている。そう、cの値が決まればa、bの探索範囲も制限できるのである。