先程、 1.2.1 で以下のように述べました。 ジェネリックプログラミングとは、クラスや型といった具体的な要素から「構造」という要素を取り出し、それ単体で物事をうまく扱おうという考え方を指しています。 では、 構造 とは何でしょう。数学的な難しい話は割愛しますが、 代数的データ型(Algebraic Data Types, ADTs) を用いることで再帰を含む複雑なデータ型を表現できることがわかっています。 そして、多くの言語ではこのADTsを言語レベルである程度サポートするための機能が備えられており、 Scalaもこうした言語のうちの一つです(後述する Tuple や sealed trait などがこれをサポートしています)。 ADTsは、 直積(Product) と 直和(Coproduct、 余積とも) から成るデータ型の総称です。 数学的な詳細な説明は割愛しますが、直積は複数のデ