列挙子スゴス

コメントにも書きましたが、LINQ落としてみました。VisualStudioにパッチが当たっているとインストールできないようで、SP1β(だったような気がする)を消したくないので、MSIをほどいて中を見てみました。
Docsの下にSequence.csを見つけて、これがまさに関数言語なライブラリでびっくりです。昨日の予測はまさにあたっていたようで、IEnumerable(以下、列挙子)がLINQの基礎になっていました。
後からずいぶん古いこの記事の真ん中あたりに、ズバリ「IEnumerable」って書いてあるのを見つけたんですけどね!

列挙をまるでプロトコルのように使って、単機能のメソッドを数珠繋ぎにして処理していくって流れのようです。
高階関数のように関数を引数に取ってるわけじゃなくて、処理結果の値を順番に取って処理しているわけだから、UNIXコマンドラインのパイプのようなイメージですかね。
ん〜、でも関数を引数に取っていないというと、うそになるか…。Predicateみたいな判断するデリゲートは取ります。
入力と出力を列挙子に揃えることで、単機能の処理であっても使い回しが利くし、処理を書くのもテストするのも簡単になります。って書くと、その利点はまさに関数型言語ですね。
C++STLイテレータを介してコンテナとアルゴリズムを繋いで関数型言語っぽいことをやってみせたように、C#では(イテレータの機能限定版の)列挙子を使ってコンテナとアルゴリズムを繋いでみせてくれます。
STLから隔世遺伝した遺伝子が、今目覚めたって感じでしょうかw