kagamihogeの日記

kagamihogeの日記です。

Scalaプログラミング入門

最近にわかに Scala という単語を聞くようになったのでここは一冊本を買って勉強しようかな、と考えタイトル買いしてきた一冊。入門というやさしげな言葉が踊っているけどいわゆる入門書とは一線を画している点は要注意です。まえがきの対象読者などに書いてあることだけど、何らかのプログラミング言語の経験が一定以上無いと本書を読むのはほぼ不可能でしょう*1。できれば関数型言語の経験があるとなおよし……無くても何らかの言語経験で基礎があれば読み進めるのはなんとかなります(ソースは俺) ガチの関数型言語でなくても、JavaScriptRuby などの Java と比べると型の考え方が軽い言語をさわりだけでも知ってると有利です。俺の場合 ActionScript の経験が本書を読み進めるのにソレナリに活きました。

本書の解説スタイルはかなり言葉を絞ってる感があります。悪く言えば、分かる人だけ分かれば良いな書き方、良く言えば、洗練された必要最小限な解説。正直言うと俺は前者の感想を覚えた方の人間です。基本的な文法の解説は第二章でされるのだけど「え、解説そんだけ?!」とかなーり面食らいました。やはり Scala に挑む上では、関数型言語の知識がないと少々厳しいかと思われます。ただ、よーく読めば大抵のことは理解できたので、想定読者レベルに達してる人にはこんくらいのサックリした記述量で丁度良いんだろなーとも思いました。てゆーか読後に改めてビビったのは、たかだか 300 ページちょいで Scala のほとんどのトピックを網羅してる点ですね……

以下、俺の本書に対する感想と Scala に対する理解と感想がごちゃまぜになって書かれています。よって、書評としては完全に機能してません。純粋な第三者による書評を求めて来られた方はゴメンナサイ。ぶっちゃけ「Scala お勉強日記」です。

まず感じたのは、複数言語知ってれば知ってるほど本書を読み進めるのはラクになるんじゃないかなーと。本書でも言及されているのだけど、Scala には目新しい概念は何も無い、と言ってるんですよね。昔から存在してる概念を Scala で実現しましたよー的な。 Scala を理解するうえでは、Scala は JVM 上で動く言語なので Java 知ってると有利なのは確か。だけど Java に染まりすぎてると Scala を理解するのはちょっと難しくなる。Java というよりは手続き型な考え方、といったほうが適切かな? 俺にとって本書の最大の収穫の一つは「関数」に対する考え方がひっくりかえったところにあるために。

手続き型な考え方でいうところの関数ってのは、すごい単純に言うと statement を寄せ集めて名前を付けたもの、に過ぎない。関数は、呼び出すとなんらかの手続きを実行してくれるだけのもの。ところが Scala では関数はすごく「偉い」存在になる。偉いってのは何とも非科学的な表現だけど、俺個人の感覚で一番近い単語が「偉い」です。関数に対する扱いが手続き型と比べるとずっと柔軟なんですよね。手続き型な考えでずっと生きてきた俺からすると、Scala の関数は、手続き型でいうところの関数と比べると色んなことができるという意味において、すげー「偉い」モノだなぁーって感じるんですよね。

でまぁ、関数が偉いって何だって話しですが。ごくごく単純にいえば関数もまたインスタンスである、ということです。関数に対してメソッドを実行したり、関数を引数に渡したり、ってのがすげぇ簡単に出来るようになります。

それだけだと、いわゆるコールバック的な処理がすげぇ書きやすくなるだけじゃん、今までだって関数ポインタとか無名クラスとかそーゆーので書けてたじゃないっすか、というのも最もな意見。とはいえ物凄く書きやすくなる、というのはそれだけでメリットでもある。もし Scala で Wicket 的なフレームワークがあったらソースの量が相当圧縮されるんじゃないかなーと素人ながらに思います(Lift がどんなもんか良く知らないけど)

本書を 2,3,4 章と読み進めていくとわかるんですが、for 文が(一部の例外を除いて)マッタクといっていいほど出てこない。コレクションをループで処理する、のではなく、コレクションに対して関数を連続して適用することによって変換的もしくは宣言的に処理するようになるので、for 文の出番は相対的に減少する。……これは自分で書いてて何を言ってるんだお前的なところがある。俺はまだまだ関数型言語はヒヨッコなので、関数型なやり方は理屈では何となく理解できるんだけど……モニョモニョってところです。

実際、俺は部分関数とか関数合成とか、関数型言語のよりアドバンス的なトピックは今ひとつ理解できていない。この辺は今後の課題かなぁー……といったところ。

パターンマッチングは switch の化け物のようなものなんだけど、単なる制御構文以上の強力さがある。最初は有り難味がよくわからなかったのだけど、アクターとの相性が抜群に良いことを第六章で学んでから少しずつ理解がすすみはじめた。アクターそのものは新しい並行プログラミングのライブラリの使い方を学ぶようなもの。メッセージパッシングモデルな感じなので、オブジェクト指向プログラミングのより原理的な議論*2を見たことがあれば馴染むのも早そう。本書でも「アクターは(略)私にとっては粒度の大きな OOP のように感じます」なんて書かれてるし。メッセージの解釈をパターンマッチングで分岐させる、ってのは結構感動した。

ところで。本書を読む人にアドバイスするとしたら、第二章であきらめないことをオススメしたい。上の節で第六章でアクターを学ぶことで第五章で出てきたパターンマッチングの理解がすすんだ、という旨の記述をした。こと関数型言語についてマッタク知らない人(俺)にとっては、アレとソレを知るとコレについて理解が深まる、という関係になっている箇所が多々あります。Scala は色んな概念を含んでいるので、複数の概念間が入れ子的に絡んでいる。なのでとりあえず第六章までダラダラーと読んでみるのがいいかなぁーと思います。それと Scala はシンタックスシュガーが強烈なのでコードに眼が慣れるまで時間かかる、って理由もあります。

でまぁ、なんで第六章までかというと、第七章以降はちょっと毛色が異なるため。第六章までは Scala をライブラリ利用者の立場で見るのに対し、第七章以降はライブラリ作成者の視点で書かれてるためです。実を言うと、俺は第七章以降のトピックはほっとんど理解できてません。

暗黙的型変換はプリプロセッサの化け物みたいだなぁーまでが俺の理解の限界でした。トレイトはマジで良くわからん。Java の interface に実装が持てるようになった、ミックスイン的なもの、というのは理解できる。ただ、トレイトはそれ以上のことが出来るっぽいんだけど、うーん……

パーサーコンビネータも同じくよくわっかんね、てのが正直な感想。BNF 的なことがカンタンに書けますよ、ってことぐらいしかわからない。XML や JSON なんかでのデータ交換系をアンマリ書いたことないから旨味がわからないのかなぁ……

最後に。本書でも言及されてますが、本書の位置づけは Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala) の入門、といえるようです。ざっくりと概観を得るなら本書が有用、より詳細なトピックは Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala) といったところのようです。

SCALAプログラミング入門

SCALAプログラミング入門

*1:プログラミングそのものが初めての人が Scala にリーチする可能性はアンマリないだろうけど

*2:「原理的な議論」って言葉はおかしな語感だが、他に良い言葉が見当たらなかったのでこう書いた。ウチの蔵書で言えば asin:4894717794:title の p.431 あたりからの「クラスのないオブジェクト指向」の議論など