C++による関数型プログラミング

関数型プログラミングでは、関数は第一級オブジェクト(first class object)です。言い換えると、関数を変数に代入したり、関数を引数や戻り値にしたりすることができます。ラムダ式(無名関数、関数リテラル)が C++11 で導入されたので是非使ってみてください。

注)関数を引数や戻り値に持つ関数を高階関数と呼びます。
注)関数の引数部分の形式を f(x, y, z) から f(x)(y)(z) のような形式にすることをカリー化(currying)と呼びます。
注)ラムダ式 []()->{} のコードブロック {} の中でパラメータリスト() にない変数を使う場合は、キャプチャリスト[] にその変数を明示する必要があります。

functional.cpp


#include <iostream>

auto add1(double x, double y) -> double {
  return x + y;
}

/* 変数にラムダ式を代入 */
auto add2 = [](double x, double y) -> double { return x + y; };

/* 引数が関数で戻り値がラムダ式 */
auto apply(auto function) -> auto {
  return [function](double x, double y) -> double { return function(x, y); };
}

auto main() -> int {
  std::cout << add1(1, 1) << std::endl;
  std::cout << add2(1, 1) << std::endl;
  std::cout << apply(add1)(1, 1) << std::endl;
  std::cout << apply(add2)(1, 1) << std::endl;
  std::cout << apply([](double x, double y) -> double { return x + y; })(1, 1) << std::endl;
}

 

注)引数や戻り値の型を auto にした場合は、C++14以降でコンパイラオプションに -fconcepts を付ける必要があります。(Windows)


g++ -std=c++14 -static -O3 -fconcepts functional.cpp -o functional.exe


参考サイト

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中