『Scalaで学ぶ関数脳入門』――オブジェクト指向プログラマが“関数脳”を手に入れるコツ
オブジェクト指向プログラマが次に読む本 Scalaで学ぶ関数脳入門 テクノロジックアート(著) 長瀬嘉秀、町田修一(監修) 技術評論社 2010年11月 ISBN-10: 4774144363 ISBN-13: 978-4774144368 3339円(税込) |
■関数型言語への注目が高まっている
近年、関数型言語への注目が高まっているように感じる。関数型言語自体の歴史は古く、1958年にMITのジョン・マッカーシー氏によって考案されたLISPが最初期の関数型言語だ。LISPは、FORTRANに次いで2番目に古い高級言語でもある。
いくらか私の主観を交えて言えば、プログラミング言語の主流は、長らくJavaやC#などの「オブジェクト指向言語」だった。CPUの進化の方向性が「高速化」から「並列化」へとシフトしつつある中で、プログラミング言語においても、いかに「並列処理」や「並行処理」を容易に実装するか、という考え方が重視されるようになる。そういった流れに対する1つの方向性として、ここにきて関数型言語に注目が集まっているようだ。
書籍『言語設計者たちが考えること』においても、C#の生みの親であるアンダース・ヘルスバーグ氏が、「並行性にどう対応していくかの課題に対して、関数型言語がカギになる可能性がある」と述べ、実際にC#にもラムダ式やクロージャなど、関数型言語由来の機能が実装されている。
そのような流れにおいて、私もシステム開発の現場に関わる人間の嗜(たしな)みとして、オブジェクト指向言語の次のパラダイムといえる関数型言語について学習すべきであると考えるようになった。
■なぜScalaなのか
現在、世の中にはさまざまな関数型言語が存在する。関数型言語は、変数の書き換えの可否によって「純粋関数型言語(変数の書き換え不可、すなわち定数のみ)」と「非純粋関数型言語(変数の書き換えが可能)」に分類され、それぞれ下記のプログラム言語が存在する。
- 純粋関数型言語:Haskell、Mirandaなど
- 非純粋関数型言語:F#、Scala、Lispなど
このうち、F#やScalaはオブジェクト指向言語と関数型言語、両方の特性を備えている。F#は.NET Framework、ScalaはJVM(Java Virtual Machine)上で動作し、それぞれ.NET FrameworkやJavaのクラスライブラリをそのまま利用できる。そのため、これらの言語は長らくオブジェクト指向言語に携わってきたプログラマにとって、比較的取っつきやすいのではないだろうか。
本書ではScalaを例に上げ、Javaとの比較を用いるなどしてプログラマの「オブジェクト指向脳」を「関数脳」にシフトさせることを目的としている。
■そもそも、関数型言語における「関数」とは何か
ここで1つ、私自身の恥ずかしい過去を告白しよう。
関数型言語を正しく学ぶまで、私は関数型言語における「関数」とは、オブジェクト指向言語や手続き型言語における「メソッド」や「関数」と同義だと思っていた。
メソッドや関数の組み合わせで動作するのだから、JavaやCだって広義では関数型言語に属するのではないか、そんな風に考えていた時期が私にはあった。そういうことを酒の席で偉そうに語り、場に微妙な空気をもたらしたこともある。
関数型言語における「関数」とは、本書によると「数学的な意味での関数を基本モジュールとしてプログラムを構成するプログラミングモデル」とある。
数学における関数には、「f(x)=x^2 + 3x + 2」のように、引数に値を渡して呼び出した際に、「戻り値は引数の値のみに依存する」という原則がある。前述の関数においては、xに1を与えると戻り値は必ず6になる。
一方、Javaなどにおけるメソッドは、オブジェクトの内部状態や外部のスコープの広い変数などに依存するため、引数に同じ値を与えても必ずしも同じ戻り値が得られるとは限らない。こういう状況を「プログラムにおける副作用」と呼び、Javaなどでプログラムを実装する際には副作用のない設計が理想とされるものの、それは言語仕様レベルで既定されているわけではない。
関数型言語は、「関数」を「数学的な意味での関数」と捉えるわけだから、副作用を言語仕様レベルで認めていないということになる(一部例外もあるが)。
関数型言語は、このように、「副作用のないプログラミング」が基本概念の1つとなる。
もう1つ、関数型言語の基本概念には「関数は値である」というものがあるが、その解説については本書をお読みいただくとしよう。
■「オブジェクト指向脳」を「関数脳」に変える面白さ
関数型言語における学習のポイントは、前述したように「関数」をどう捉えるか、というところによる。長らく「メソッド」という考え方を体に染み込ませている「オブジェクト指向脳」を、「関数脳」にシフトする工程はとても刺激的で、新しい知識を得る喜びを味わえるだろう。
本章では順を追って丁寧に、「関数型言語とは何か」を解説してくれる。
目次を見てみよう。
第1部 導入編
第1章 Scalaで関数脳を習得しよう
第2章 Scalaことはじめ
第2部 基礎知識編
第3章 関数型プログラミング
第4章 コレクション
第5章 再帰
第6章 パターンマッチング
第7章 型
第8章 並行プログラミング
第3部 応用技術編
第9章 メッセージパッシングとアクタープログラミング
第10章 言語処理プログラミングとパーサーコンビネータ
第11章 DSL
付録 Scala入門
導入編においてScalaの簡単な解説、続いて基礎知識編でじっくりと関数型言語についての理解を深めていき、応用技術編ではかなりディープな世界に触れることができる。個人的に最終章のDSLはエキサイティングだった。この辺りの興奮は、ぜひ本書を読んで体感していただきたい。
1つだけ注意点を書かせていただくと、本書はScalaを例にとった「関数型言語」の入門書である。付録などでScalaの言語仕様について親切な解説が付与されているが、Scalaという言語そのものを深く追究する本ではない。
より良いプログラマになるためのプラクティスとして、1年に1つずつ新しい言語を学ぶ、というものがある。今年、何の言語を学ぼうか悩んでいる方は、本書を手に取り、関数型言語のエキサイティングな知識体験を味わってみてはいかがだろうか。
(『雲(クラウド)の隙間から青空が見えた』 コラムニスト 粕谷大輔)