【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

高階関数

m107さんのコメントへのお返事です。

引数で関数を渡すというのは高階関数と呼ばれる関数型の概念です。このテクニックが必要になる背景を簡単に説明します。

A
{
    B
}

のようなコードがあちこちにあったとします。AもBも複雑な条件や処理だとします。Bで共通のものが多ければ、Bを関数にまとめます。もしAに共通のものが多いのにBはまちまちであればどうするでしょうか。こういうときに使うのが高階関数です。Aを関数にしてブロックを渡してしまうわけです。

C言語でもqsort()など一部で使われていますが、C言語では別途関数を作成して関数ポインタを渡します。関数定義をインラインでできるようにしたのが無名関数で、外のローカル変数へアクセス(レキシカルスコープ)できるようにしたものをクロージャと呼びます。

TwitterWMでは高階関数を非同期の処理を分散せずに同期っぽく書くのに使っています。同じようなテクニックはスレッドでも使えます。

int sum = 0;
var t = new Thread(() =>
{
    for (int i = 1; i <= 10000; i++) sum += i;
});
t.Start();

上の例ではクロージャの中から外のローカル変数sumを参照していますが、これがレキシカルスコープです。

今年は関数型言語の概念だけでも理解したいなあ」とのことですが、いきなりHaskellなどに手を出すよりも、こういう感じで少しずつクロージャを取り入れるようなやり方が良いのではないでしょうか。C#で不足を感じるようになればF#という選択肢もあります。次のVisual Studio(2010?)ではF#が正式に取り込まれるという噂です。