C++ で関数型プログラミング

整数を読んでその階乗を出力するだけのプログラム。

#include <iostream>
#include <algorithm>
#include <iterator>   // istream_iterator, ostream_iterator
using namespace std;

int factorial(const int n) {
  return (n <= 1) ? 1 : n * factorial(n-1);
}

int main() {
  transform(istream_iterator<int>(cin),
            istream_iterator<int>(),
            ostream_iterator<int>(cout, "\n"),
            factorial);
}

地味に楽しい。しばらくこのスタイルでいろいろ書いてみよう。
型推論とかパターンマッチとか欲しくなりそうだけど。
ループを自分で書いたほうが速いプログラムができるだろうけど。

メモ

  • 入力ストリームイテレータ(istream_iterator
    • 引数なしコンストラクタで作ったオブジェクトを終端扱い
  • 出力ストリームイテレータ (ostream_iterator)
    • コンストラクタの第二引数はデリミタ (string型)
    • inserter と同様、参照外して代入すると自動的にインクリメントされる
  • 書式なしの1文字ごとの入出力には、istream_iterator / ostream_iterator ではなくistreambuf_iterator / ostreambuf_iterator を使うと速い。