かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

手軽なスクリプト言語としてのF# その17「リスト」

さて、一番プログラムを書いててお世話になるリストの時間になりました。リストといえば何回か使ってきましたが、このリストはいくつかプロパティを持ってたりします。

let list = [1..10]
printfn "list.Head = %d" list.Head
printfn "list.Tail = %A" list.Tail
printfn "list.Item 1 = %d" (list.Item 1)
printfn "list.IsEmpty = %A" list.IsEmpty

実行結果は以下の通りになります。

list.Head = 1
list.Tail = [2; 3; 4; 5; 6; 7; 8; 9; 10]
list.Item 1 = 2
list.IsEmpty = false

どれも直感的だとは思いますが、個人的に気持ち悪かったのはTailです。Tailっていうからには最後の要素じゃないの?と思ってたけど2つ目以降の要素全部返すみたいです。

さて、Listの使いかたはまだまだここからが本番です。Listモジュールに鬼のようにメソッドが定義されてます。

こいつらを使えばListに対して色々な処理が可能になります。さらに、前に紹介したパイプ演算子と組み合わせると、まるで流れるように処理がかけるというおまけつき。試しに、1〜10までの数字を2乗して足し合わせた結果を表示するプログラムを書いてみます

// ありあわせの関数を組み合わせると…
[1..10] |>
    List.map (fun x -> x * x) |>
    List.reduce (fun acc v -> acc + v) |>
    printfn "合計 = %d"

// 普通にループで書くと…
let sum = ref 0
for i in [1..10] do
    sum := !sum + i * i
printfn "合計 = %d" !sum

上側がListモジュールにある便利関数を使ったケース。下側が素直?にループやらなんやらで書いた場合。どっちが見やすいかは個人の好みかな?個人的には上のようにサクッと書いてしまいたいぜ。sumみたいな変数を作らなくてもさくっとかけるのがアツイ。