関連サイト
本書の関連ページが用意されています。
内容紹介
『本書に寄せて --- Martin Odersky Scala言語設計者』より――
本書は深く考えさせる本です。細部への注意を促し、プログラミングに対するあなたの考え方を否定するかもしれないからです。本書を読み、推奨されている練習問題を解くことで、純粋関数型言語とは何か、その言語で何を表現できるか、それにはどのようなメリットがあるかについて理解を深めることができるでしょう。
特に気に入っているのは、すべてがこの1冊に含まれていることです。可能な限り単純な表現から始まり、すべての抽象概念を詳しく説明した後、それらの上にさらに抽象概念を組み上げていきます。ある意味、表紙の向こうにScalaの別世界が展開します。その世界では、ミュータブルな状態は存在せず、すべての関数が純粋です。よく使用されるScalaライブラリは主に、関数型のインターフェイスを持ちながらも部分的に命令型の実装に基づいているため、この理想郷に少し似つかわしくありません。私の考えでは、ミュータブルな状態を関数型のインターフェイスにカプセル化できることは、Scalaの長所の1つです。しかし、その能力がよく誤用されることも事実です。それにはまって抜けられなくなっていることに気づいた場合は、本書が強力な毒消しになります。
書誌情報
- 著者: Paul Chiusano, Rúnar Bjarnason(著), 株式会社クイープ(訳)
- ページ数: 392ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: インプレス
対象読者
情報科学系の学生から職業プログラマーまで。Scalaプログラマーの初中級者。関数型プログラミングの初級者。
著者について
Paul Chiusano
Scalaや関数型プログラミングなどのソフトウェア開発コンサルタント。2008年以降、Scala による関数型プログラムを商用ベースで展開。
Rúnar Bjarnason
プログラマー歴は12年。2008 年から関数型プログラミングに注力。関数型プログラミングやScalaプログラミングをテーマにブロガーやスピーカーとして活躍中。ScalazライブラリやJava関数型ライブラリ開発の主要なコントリビューターである。
株式会社クイープ
1995年、米国サンフランシスコに設立。コンピュータシステムの開発、ローカライズ、コンサルティングを手がけている。2001年に日本法人を設立。主な訳書に、『IT技術者なら知っておきたいストレージの原則と技術』、『Smashing Android UI』、『シスコ技術者認定試験 公式ガイドブック Cisco CCENT/CCNA ICND1 100-101J』、『シスコ技術者認定試験 公式ガイドブック Cisco CCNA Routing and Switching ICND2 200-101J』、『Raspberry Pi ユーザーガイド 第2版』などがある(いずれもインプレスジャパン発行)。http://www.quipu.co.jp
水島 宏太(テクニカルレビューア)
東京都の某社にてエンジニアとして活動中。プログラミング言語(特にScala)や型システム、パーサーなどといった話題が大好き。一般社団法人Japan Scala Association代表理事。
吉田憲治(テクニカルレビューア)
2013年、2014年と、Scalazへ一番多くコミットしているコミッター。twitterアカウント @xuwei_k
目次
本書に寄せて
謝辞
Part.I 関数型プログラミングの基礎
- 1.1 関数型プログラミングの利点:単純な例
- 1.2 関数とはいったい何か
- 1.3 参照透過性、純粋性、置換モデル
- 1.4 まとめ
第2章 Scala関数型プログラミングの準備
- 2.1 速習:Scala言語
- 2.2 プログラムの実行
- 2.3 モジュール、オブジェクト、名前空間
- 2.4 高階関数:関数に関数を渡す
- 2.5 多相関数:型の抽象化
- 2.6 型に従う実装
- 2.7 まとめ
第3章 関数型プログラミングのデータ構造
- 3.1 関数型データ構造の定義
- 3.2 パターンマッチング
- 3.3 関数型データ構造でのデータ共有
- 3.4 リストの再帰と高階関数の一般化
- 3.5 ツリー
- 3.6 まとめ
第4章 例外を使わないエラー処理
- 4.1 例外の光と影
- 4.2 例外に代わる手法
- 4.3 Optionデータ型
- 4.4 Eitherデータ型
- 4.5 まとめ
第5章 正格と遅延
- 5.1 正格関数と非正格関数
- 5.2 遅延リストの例
- 5.3 プログラムの記述と評価の切り分け
- 5.4 無限ストリームと余再帰
- 5.5 まとめ
第6章 純粋関数型の状態
- 6.1 副作用を使った乱数の生成
- 6.2 純粋関数型の乱数の生成
- 6.3 ステートフルAPIの純粋化
- 6.4 状態の処理に適したAPI
- 6.5 状態アクションデータ型の一般化
- 6.6 純粋関数型の命令型プログラミング
- 6.7 まとめ
Part.II 関数型デザインとコンビネータライブラリ
第7章 純粋関数型の並列処理
- 7.1 データ型と関数の選択
- 7.2 表現の選択
- 7.3 APIの改良
- 7.4 APIの代数
- 7.5 コンビネータを最も汎用的な形式に改良する
- 7.6 まとめ
第8章 プロパティベースのテスト
- 8.1 速習:プロパティベースのテスト
- 8.2 データ型と関数の選択
- 8.3 テストケースの最小化
- 8.4 ライブラリの使用とユーザビリティの改善
- 8.5 高階関数のテストと今後の展望
- 8.6 ジェネレータの法則
- 8.7 まとめ
第9章 パーサーコンビネータ
- 9.1 代数の設計から始める
- 9.2 代数の例
- 9.3 文脈依存への対処
- 9.4 JSONパーサーの作成
- 9.5 エラー報告
- 9.6 代数の実装
- 9.7 まとめ
Part.III 関数型デザインに共通する構造
第10章 モノイド
- 10.1 モノイドとは
- 10.2 モノイドによるリストの畳み込み
- 10.3 結合性と並列性
- 10.4 並列解析の例
- 10.5 畳み込み可能なデータ構造
- 10.6 モノイドの合成
- 10.7 まとめ
第11章 モナド
- 11.1 ファンクタ:map関数の一般化
- 11.2 モナド:flatMapと単位関数の一般化
- 11.3 モナドコンビネータ
- 11.4 モナド則
- 11.5 モナドとはいったい何か
- 11.6 まとめ
第12章 アプリカティブファンクタとトラバーサブルファンクタ
- 12.1 モナドの一般化
- 12.2 アプリカティブトレイト
- 12.3 モナドとアプリカティブファンクタの違い
- 12.4 アプリカティブファンクタの利点
- 12.5 アプリカティブの法則
- 12.6 トラバーサブルファンクタ
- 12.7 Traverseの使用
- 12.8 まとめ
Part.IV 作用とI/O
第13章 外部作用とI/O
- 13.1 作用のリファクタリング
- 13.2 単純なIO型
- 13.3 StackOverflowErrorの回避
- 13.4 より高機能なIO型
- 13.5 ノンブロッキングの非同期I/O
- 13.6 汎用目的のIO型
- 13.7 なぜIO型ではI/Oのストリーミングに不十分なのか
- 13.8 まとめ
第14章 局所作用とミュータブルな状態
- 14.1 純粋関数型の変更可能な状態
- 14.2 副作用のスコープを適用するためのデータ型
- 14.3 純粋性とコンテキスト
- 14.4 まとめ
第15章 ストリーム処理とインクリメンタルI/O
- 15.1 命令型I/Oの問題:例
- 15.2 単純なストリームトランスデューサ
- 15.3 拡張可能なProcess型
- 15.4 応用
- 15.5 まとめ