オブジェクト指向から関数型プログラミングへ『Scala 入門 (Essential Scala)』序文

[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) で公開されている [Essential Scala](https://underscore.io/books/essential-scala/) の Overview と Prerequisites、Learning Outcomes、[Foreword](https://books.underscore.io/essential-scala/essential-scala.html#foreword) を日本語訳したものです。日本語訳においてもライセンスは同じものを継承しています。毎日少しずつ翻訳を進めており、最新の日本語訳は [Scala 入門 (Essential Scala)](http://takuya0301.github.io/essential-scala.html) にあります。

原書：[underscoreio/essential-scala](https://github.com/underscoreio/essential-scala)
訳書：[takuya0301/essential-scala-ja](https://github.com/takuya0301/essential-scala-ja)

# 概要

Scala 入門 (Essential Scala) は、はじめて Scala に出会う経験豊富な開発者を対象にしています。Scala におけるオブジェクト指向と関数型プログラミングの融合を修得するのに、あなたのこれまでのスキルを活かしましょう。

本書では、Scala における文法の基礎から高度な問題解決のテクニックまでを学ぶことができます。とくに、Scala を最大限活用するのに必要な関数型プログラミングの考え方を養うことに重点を置いています。各節では実践に焦点を当てつつ、より深い内容と演習を織り交ぜています。

あなたが経験豊富な開発者で、Scala への最初の一歩を踏み出そうとしていて、素早く情報を得たいのであれば、本書はあなたにとって最適な一冊になることでしょう。

# 前提条件

本書から利益を得るには、オブジェクト指向プログラミング言語（Java、C# など）または関数型プログラミング言語（Hakell、Lisp など）で1〜2年の経験があり、オブジェクト指向プログラミング言語または関数型プログラミング言語の概念をよく理解している必要があります。（訳注：本書の序文には「Java のようなオブジェクト指向プログラミング言語にある程度精通していること」という前提が記載されています。）

# 学習成果

Scala でのオブジェクト指向プログラミングと関数型プログラミングの実践的な知識を修得します。Scala の豊富なコレクションフレームワークを最大限に活用するために必要な共通のパターンも学びます。

Scala の洗練されたパターンマッチング機能と、それらがサポートするプログラミングスタイルを総合的に理解します。

Scala の柔軟な文法や名前渡し引数、暗黙の型変換と暗黙の引数が、流暢なインターフェイスと洗練された内部ドメイン特化言語の作成をどのようにサポートするのかを学びます。

# 日本語訳を読むにあたって推奨する事前準備（訳者追記）

本書は Scala コンソールに入力しながら Scala を学んでいくスタイルになっています。なので、[SDKMAN!](https://sdkman.io/) や [Homebrew](https://brew.sh) などで Scala をインストールして、Scala コンソールを立ち上げてから読み始めましょう。

```shell-session
$ sdk install scala 2.13.1 # or `brew install scala`
$ scala
Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 1.8.0_242).
Type in expressions for evaluation. Or try :help.

scala> println("Hello Scala!")
Hello Scala!

scala> :quit
$
```

# ライセンス

Written by [Dave Gurnell](http://twitter.com/davegurnell) and [Noel Welsh](http://twitter.com/noelwelsh). Copyright [Underscore Consulting LLP](http://underscore.io), 2015-2017.
Translated by [Takuya Tsuchida](http://twitter.com/takuya0301). Copyright Takuya Tsuchida, 2020.
![CC BY-SA 4.0 logo](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.

# 目次

[序文](https://qiita.com/takuya0301/items/ddbe5493273d317cbb06)
[第1章 はじめに](https://qiita.com/takuya0301/items/6528b130f43dc5a3cb48)
[第2章 式・型・値](https://qiita.com/takuya0301/items/08e3101f84193f9e7346)
[第3章 オブジェクトとクラス](https://qiita.com/takuya0301/items/df373bf12a2560647c9e)
第4章 トレイトによるデータモデリング
第5章 シーケンス処理
第6章 コレクション
第7章 型クラス

# 序文

本書は、はじめて Scala を学ぶプログラマーを対象にしています。Java のようなオブジェクト指向プログラミング言語にある程度精通していることを前提としていますが、関数型プログラミングについての経験は前提としていません。

本書のゴールは最小限の Scala の使い方を説明することです。そのため、Scala コードにおいてイディオムとして使用される重要パターンに焦点をあて、Scala の機能が可能にするそれらのパターンにおける文脈で Scala の機能自体を紹介していきます。Scala の機能を網羅することを目的とはしていませんし、本書はリファレンスマニュアルでもありません。

いくつかの演習を除いて、外部ライブラリには一切依存していません。本書に含まれるすべての問題は、テキストエディターと Scala の REPL、もしくは、[Scala IDE for Eclipse](http://scala-ide.org/) や [IntelliJ IDEA](http://www.jetbrains.com/idea/) のような IDE で完成させることができます。

Scala 入門 (Essential Scala) は、[Underscore](http://underscore.io) の [Noel Welsh](http://noelwelsh.com) と [Dave Gurnell](http://davegurnell.com/) によって生み出されました。それは、[Underscore's eBook Template](https://github.com/underscoreio/underscore-ebook-template) とプレーンテキスト、関数型プログラミングへの深い愛情によって構築されました。

## 本書で使用している規則

本書には、たくさんの技術情報とプログラムコードが含まれます。曖昧さを減らし、重要な概念を強調するために、下記のような組版規則を使用します。

### 組版規則

新しい用語やフレーズは**太字**で紹介されます。（訳注：原書では斜体ですが、訳書では視認性の高い太字を使用します。）最初に紹介されたあとは、通常の字体で書かれます。

プログラムコード由来の用語やファイル名、ファイルの内容は`等幅フォント`で記述します。単数形と複数形を区別しないことに注意してください。例えば、`String` や `Strings` と書いたものは `java.util.String` クラスやその型のオブジェクトを参照します。（訳注：日本語訳ではすべて単数形に統一しています。）

外部リソースへの参照は[ハイパーリンク](https://underscore.io)として記述します。API ドキュメントへの参照は、[`Option`](https://www.scala-lang.org/api/current/index.html#scala.Option) のように、ハイパーリンクと等幅フォントの組み合わせを使用して記述します。

### ソースコード

ソースコードブロックは下記のように記述されます。文法は必要に応じて適切にハイライトされます。

```scala
object MyApp extends App {
  println("Hello world!") // ユーザーへの素晴らしいメッセージを印字する！
}
```

プログラムコードのいくつかの行は、ページに収めるには広すぎるものがあります。そのような場合には、すべてを1行で書かれるべき長いコードであることを示すために、折れた矢印の**継続文字 (continuation character)** を使用します。例えば、下記のようなコードを、

```scala
println("This code should all be written ↩
  on one line.")
```

実際は、下記のように書かれなければなりません。

```scala
println("This code should all be written on one line.")
```

### コールアウトボックス

本書では、特別な内容を強調するために、3種類の**コールアウトボックス (callout box)** を使用します。（訳注：原書では背景色でコールアウトの違いを表現していますが、Qiita では見出しに絵文字を付与することで表現します。）

---

#### :information_source: 情報コールアウト

情報コールアウトは、要約やレシピ、ベストプラクティスを示します。

---

---

#### :warning: 警告コールアウト

警告コールアウトは、コーナーケースや根本的な仕組みに関する追加情報を提供します。本書を最初に読むときはこれらの情報を読み飛ばして構いません。のちほど、追加情報が必要なときに戻ってきましょう。

---

---

#### :skull_crossbones: 危険コールアウト

危険コールアウトは、よくある落とし穴や罠を示します。問題を回避するために確実にこれを読んでください。もし、コードを実行するとき問題に見舞われたら、ここに戻ってきましょう。

---