はじめに

関数型言語を知っていますか?
現在のプログラミング言語はオブジェクト指向が主流ですが、他にもさまざまなパラダイム(考え方)を取り入れています。
そのひとつが「関数型」です。
そして、関数型をメインパラダイムとする言語が関数型言語ということになります。
それでは、関数型言語はオブジェクト指向言語となにが違うのでしょうか?
この記事では、関数型言語を知りたいプログラマーの方のために、関数型言語F#を取り上げて説明していきます。
ぜひご一読して、オブジェクト指向以外の考え方も学んでみましょう。

関数型とオブジェクト指向はどう違うのか?

オブジェクト指向では、変数やメソッドをクラスにまとめ、比較的大きな単位で管理します。
これはクラス内に状態を隠蔽し、ひとつのコンポーネントのように扱うためです。
クラス単位でのプログラミングは、オブジェクト指向の基本的な考え方です。
一方、関数型言語では、クラスではなく「関数」という更に小さい単位でプログラミングします。
クラスを組み合わせるのではなく、小さな関数を組み合わせてプログラムを構成するのです。
各関数は小さいため、簡単に理解でき、再利用性も高くなります。
関数型言語の関数は、できるだけ「副作用」がないように記述し、副作用は別の関数に分離します。
副作用がない状態とは、入力(引数)に対して出力(返り値)が一定であることです。
出力以外の状態変化もありません。
副作用がない関数は入力に注意すればいいだけなので、どのような場所でも使用でき、他の関数と組み合わせても問題を起こしにくいのです。
副作用の代表格は「ループ」でしょう。
オブジェクト指向ではループにforを使いますが、この時カウンター変数を使用します。
変数への割り当ては副作用を伴う可能性があるため、できるだけ控えたいところです。
そのため、関数型言語ではmapやreduceなどイテレーション関数を使います。
または、再帰処理を使って関数自身を再度呼び出すこともあります。
このように、関数型言語では変数の割り当てやループ処理など、副作用が起きそうなことを徹底的に排除します。

.NET開発者の方はF#がオススメ!

F#は、マイクロソフトが開発した関数型言語で、.NET系言語のひとつです。
完全な関数型ではなく、オブジェクト指向も取り入れているため、両方の記述が可能なハイブリッド言語といえます。
このため、オブジェクト指向から段階的に移行することもできます。
公式のフレームワークが用意されていないため、言語単体で使うにはやや心もとないですが、他のC#やVisual Basicなどの.NET言語と相互運用できるため、F#でライブラリ(DLL)を作成し、それをC#などから使うといったことができます。
言語仕様はOCamlがベースとなっており、構文もよく似ています。
Pythonのようにブロックにインデントを使用しているため、スッキリとしたコードが書けます。
キーワードや演算子も短く簡潔です。
オブジェクト指向もサポートしているため、初めはオブジェクト指向寄りのコーディングになってしまいがちですが、徐々に関数型のプログラミングに慣れていくとよいでしょう。

オンラインエディターも活用しよう

.NET開発者の方は、ほとんどの方がVisual Studioをインストールしていると思いますので、F#の追加インストールも簡単です。
すでに使える状態になっているかもしれませんね。
まだVisual Studioをインストールしていない方は、F#を試すためにVisual Studioをインストールしたくないという方もいるでしょう。
そんな方は、オンラインエディターを試してみましょう。
Visual Studioをインストールすることなく、F#を気軽に試せます。
F#オンラインエディター:http://www.tryfsharp.org/Create

まとめ

関数型言語はオブジェクト指向とはプログラミング方法が異なっており、
最初はその違いに戸惑うでしょう。
しかし、習得できれば見通しのよい簡潔なコードが書けるようになります。
F#に限らず、Scala、Haskellなど関数型言語は他にもたくさんありますので、好みの言語を使ってみましょう。