かんすうしきプログラミング


ブログ自体は初めてなのでどう書けばいいのかわかりませんが、簡単に書いてみたいと思います.
本科生時代、プログラミング(C)とオブジェクト向けプログラミング(C++)はプログラミング言語に初めて触れた.
学年になって、javaやPhythonのような言語に触れて、新しい言語も概念自体がCとC++の中であまり違いがないと思っています.
しかし,開発者として就職して初めて関数式プログラミングに触れたとき,これは非常によく知られていない概念であった.
それでも、新しいプログラミングモードに触れて勉強すれば、コードを書く方法にも異なる視点があります.
詳細は他のブログでも多く、ここでは例を挙げて簡単に説明します.

関数プログラミングとは?


ウィキペディアによると、データ処理は数学関数の計算と見なされ、状態や可変データから離れたプログラミングパターンである.
関数式プログラミングWikipedia
実はその言葉を聞いているだけで、全然感じませんでした.
簡単に言えば、
プロシージャ向けプログラミングなどのコマンドプログラミングはどのように行われますか.
関数式プログラミングなどの宣言式プログラミングとは何をするか(What)です.
関数f(x)の結果値はxの値のみに依存して変化すると考えられる.
実は百聞は一見にしかず、例題を見ると理解しやすい.

コマンドプログラミングvs関数プログラミング例


命令式プログラミングはC++を例に,関数式プログラミングはErlangを例にとる.
C++でQuicksortを実装するサンプルコード
void quickSort(int *data, int start, int end) {
  if (start >= end) return;
  int pivot = start;  
  int i = start + 1;
  int j = end;

  while (i <= j) {
    while (data[i] <=data[pivot]) 
      i++;
    while (data[j] >= data[pivot] && j > start)
      j--;
    if (i > j) 
    {
      int temp = data[j];
      data[j] = data[pivot];
      data[pivot] = temp;
    } else {
      int temp = data[j];
      data[j] = data[i];
      data[i] = temp;
    }
    quickSort(data, start, j - 1);
    quickSort(data, j + 1, end);
  }
}
しかし,Erlang実装を用いると,以下のように簡単に記述できる.
-module(qsort).    
-export([qsort/1]). 

qsort([]) -> []; 
qsort([Pivot|Rest]) ->
    qsort([Front || Front <- Rest, Front < Pivot]) ++ 
    [Pivot] ++
    qsort([Back || Back <- Rest, Back >= Pivot]).
EllangShellでqsortをコンパイルしqsortを使用

何行も打っていないので、結果は簡単です!
例を挙げると、コマンドプログラミングと関数プログラミングの違いは明らかだと思います.
もちろん、上記の例では、すべての関数プログラミングを説明するのに十分ではありません.
既存のプログラム的思考とは異なる思考を試してみるのもいい選択です.