かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

手軽なスクリプト言語としての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みたいな変数を作らなくてもさくっとかけるのがアツイ。