この記事は?
Scalaスケーラブルプログラミング第3版を読んで、個人的に気になった箇所や勉強になった箇所のまとめです。
認識誤りなどがあればご指摘いただけると幸いです。
第1章 スケーラブルな言語
Scalaはプログラマーが修正・拡張できるように設計されている
組み込み型(Scalaの中核機能として組み込まれている型)になくても、新しい型を作ることも可能。
型同様にScalaでは新しい制御構造も作ることができる
Scala APIのAkkaのreceive
ブロックやメッセージ送信(!
)はScalaの組み込み演算ではない。
Scalaはオブジェクト指向言語である
Scalaは純粋なオブジェクト指向言語である。例えばScalaの1 + 2
はIntクラスの+
と言うメソッドを呼び出している。
Scalaにはトレイト(traits)というものがある。トレイトはJavaで言うインタフェースのようなものだが、Javaのインターフェースと違い、メソッドの実装やフィールドを持つことができる。
またクラスにトレイトのメンバーを追加することでミックスイン合成(mixin composition)というテクニックを使うこともできる。
Scalaは関数型言語である
関数型言語には2つの特徴的な発想がある。
- 関数を一人前の値(first class value)として扱うことができる。整数や文字列と同様に関数を他の引数に渡したり、処理結果として返すことができる。
- データはイミュータブル(書き換えができない)ものであるべきという発想。メソッドは副作用(side effect)を持ってはならず。参照透明(referentially transparent)1であるべきという発想がある。
Scalaを選ぶべき理由
- 互換性
- 簡潔さ
- 高水準の抽象
- 高度な静的型付け
互換性
ScalaはJavaとの相互運用を実現するように設計されている。
ScalaプログラムはコンパイルするとJava仮想マシンバイトコードになる。
簡潔性
極端にいうとScalaのコード量はJavaの10分の1程度に短縮できる。
その理由は2つあり、1つはJavaのように必ず書かなければいけないコードが少ないこと。もう1つはScalaには型推論があり、型情報を反復する必要がないから。という理由があげられる。
高水準の抽象
Javaではループ処理を使った冗長なコードでしか実現できないことをScalaでは述語関数などを用いて簡潔にすることができる。
例えば文字列に大文字が含まれているかを調べる処理はScalaとJavaで以下の違いがある。
// これはScala
val nameHasUpperCase = name.exists(_.isUpper)
// これはJava
boolean nameHasUpperCase =
name.chars().anyMatch(
(int ch) -> Character.isUpperCase((char) ch)
);
高度な静的型付け
ScalaにはJavaのような静的型システムを持ちつつ、静的言語によくある冗長性を型推論により取り除き、柔軟性のなさをパターンマッチングと型を記述したり合成できる方法で回避している。
Scalaのルーツ
Scalaは多くのプログラミング言語の影響を受けている。
表面的にはJavaやC#の構文を採用しているが、オブジェクトモデルはSmalltalk, Rubyから、関数型プログラミングはSML, OCaml, F#に近い。
またアクターベースの並行処理ライブラリであるAkkaはErlangの影響を受けている。
-
参照透明とはJavaのStringクラスの
replace
メソッドのように元のデータを書き換えない、他の作用を持たないこと ↩