体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

JavaScript関数、Reactive Extensions(Rx)など、話題の関数型プログラミングを徹底解説!

関数型プログラミングは手続き型と同じぐらい古くからある

最初に登壇したのは、日本マイクロソフトのエバンジェリスト、荒井省三さん。「実践F♯関数型プログラミング入門」の著者であり、この本を元に、関数型プログラミングの解説が行われた。

関数型プログラミングは、手続き型と同じぐらい古くからある言語だ。英語で手続き型は「Imperative paradaigm」と呼ばれる。

一方、関数型は論理プログラミングを含めて宣言型パラダイム「Declarative paradaigm」と呼ばれる。つまり宣言型パラダイムには論理型パラダイムと関数型パラダイムの2つがある。

ちなみにPLANERやPrologは論理型パラダイムに属する。プログラムパラダイムがなぜできたかというと、何かの作業をさせたいという手続きや命令を書く作法が違うからだ。

日本において宣言型(関数型と論理型)言語はどのように活用されてきたのか。

1982年に当時の通産省による国家プロジェクト「知識情報処理指向の第五世代コンピュータ・プロジェクト」をきっかけに、関数型言語や論理型言語の専用コンピュータが開発されるようになった。

当時から宣言型パラダイムを実現したプログラミング言語は、非常にコンピュータリソース、パフォーマンスを必要としていた。

そのため、専用機の開発という研究者の世界でしか使われてこなかったのだ。

一般の人たちが使うようになったのは、インテルのCPUが出てきてからである。JavaScriptは関数型の中にオブジェクト指向の考え方をミックスした言語だ。ただ、ハイブリッドなので、関数型では不要なif文やfor文を使う。

例えば手続き型言語の一つ、C言語では最初に覚える処理にリスト処理がある。この処理があるのは、C言語が集合を扱う方法がないからだ。

一方、例えばLispという言語は、LIST処理を目的に開発された言語であるというように、関数型の言語は最初から集合を扱う前提になっている。

前述したようにfor文も関数型では使われない。また関数型ではifは用意されているが、if文ではなく「ifファンクション」として使う。

関数型でいうところの関数は、何かの引数を取って必ず値を返すということだからだ。一般的にCやJavaではVoidが使われる。

これを関数型のパラダイムで考えると、Void型となり、Voidという値を返しているという考え方をする。またVoidに相当するものとして、unitを設けており、値を返さない場合はunitを返すのである。

こうすることで、関数の基本である「何らかの引数をとって必ず値を返す」ことを外さないようにする。

基本から外れないというメリットは、コンパイラが文法チェックを100%できること。例えば手続き型ではif文を書かないことができるが、関数型ではそれを許されず、コンパイラはエラーを返す。

つまり、関数型の方が厳格にプログラムを書くことになるので、バグの混入が非常に少なくなるのだ。

関数型言語はモジュール化の概念を標準で持っていることも特長の一つ。よく、「良いプログラミングはモジュール同士の強度を低くすること」と言われているが、それをさらにモジュール分類しようというのがモジュール化の概念である。

JavaではModule Specification、JavaScriptも最新のECMAScript 6ではモジュールの概念が入ってくるが、関数型言語ではそれを標準で実現する。

関数型の特徴「イミュータブル」。このメリットとは?

関数型言語で慣れないのは、イミュータブルという考え方だ。例えばOCamlというオブジェクト指向をミックスした言語がある。

この言語でオブジェクトを作ると書き換えができるようになっているが、関数型言語なのでプロパティでアクセスできるのは読み出すだけである。

そこでプロパティを変えたいときは、新しいインスタンスに作り替えるということで書き換えできるようになる。新しいインスタンスを作って古いものを捨てるので、関数型言語の特長のイミュータブル性が保たれるというわけだ。

1 2 3 4 5 6次のページ
CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。