すでにみなさんにとって馴染み深い例のパズルの解答例を通してScalaの文法を復習します.すでに教わった内容もあれば,新しい内容もあることと思います.

ソフトウェアの規模が増大するにつれてプログラムが大きくなることは当然のことです.プログラムが大きくなれば,巨大なプログラムのなかでプログラムをわかりやすく整理し,目指すコード領域を効率的に見つけだすための高度な編集技法が求められます.いくか,テキストエディタの操作に習熟しても,巨大なソフトウェアをひとつのファイルに収めることは困難です.

ソフトウェアの成長にともなって,それを複数のファイルに分割して保存することが求められます.わたしたちが対象としているパズルは小さなものなので,普通はわざわざ分割するほどのこともありませんが,ここでは分割の方法についても学ぶために敢て分割してみました.プログラム全体は以下のように構成されています.

この例は,パズルのふたつの解法をsolution1とsolution2として与えています.main.scalaは,これらふたつの解法を実行し,結果を出力する小さなプログラムです.ふたつの解法について,それぞれ実行し,その結果をそれぞれ出力することもできますが,main.scalaでは,それぞれの解法を一括して処理することで記述量を削減する工夫を施しています.この仕掛けによって,今後,さらに別解が増えたときもmain.scalaを大幅に変更しないですむようになっています.

さて,solution1.scalaとsolution2.scalaは中身を見るとわかるように異なる解法で,プログラムの構造も異なります.でも,細かい違いを除けばいくつかの共通する性質もあります.重要な点はmain.scalaがこの共通点のみを用いて記述できている点です.この点について既視感はありませんか?たとえば,List(0, 1, 2)List(3, 4)は異なる内容ですが,リストだという点では共通しています.リストに対しては,mapやfoldなどの関数を適用することができます.このようなデータの類似性をScalaは型という概念で扱ってきました.

solution1.scalaやsolution2.scalaに与えられるプログラムの構造の類似性については,Scalaはtraitというある種の型の概念を用いて共通に扱える枠組みを提供しています.つまり,solution1.scalaとsolution2.scalaの共通性についてsolution.scalaのなかでsolution traitを定義しています.その結果,main.scalaではsolution1.scalaとsolution2.scalaの違いには目をつぶって,両者に共通する性質のみを用いて,解法を実行し,画面に出力することができています.

今回の講義では,objectやtraitなどのプログラムの構造のほか - メソッドの概念 - mainメソッド - 無名関数 - Scalaの標準ライブラリメソッド - 多相型の扱い などについて学びます.