Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド

Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド

¥3,900+税

品種名
書籍
発売日
2015/3/20
ページ数
392
サイズ
B5変形判
著者
Paul Chiusano 著/Rúnar Bjarnason 著/株式会社クイープ 訳
ISBN
9784844337768

一貫した、合成可能な、美しい方法へ。関数型を深める!

一貫した、合成可能な、美しい方法へ。関数型を深める! >>>データ構造/入出力/エラー処理を関数型で記述。ライブラリを設計・開発。関数型プログラミングの共通パターンを見抜く――本書は、Scalaプログラムを関数型の手法で設計・開発するための解説書です。著者は、Scala拡張クラスライブラリScalazのコントリビューター(開発貢献者)。Scalaは、オブジェクト指向と関数型のいずれにも対応した言語ですが、本書では関数型を指向し、より簡潔で洗練された副作用のない手法を解説。「モジュール化/再利用化/並列化を進めやすい」などのメリットを享受すべく、関数型プログラミングのパラダイムを深めていきましょう。※本書は『Functional Programming in Scala』の翻訳書です。

「読者アンケートに答える」「読者プレゼントに応募」の場合もこちらをご利用ください。

アンケートに答える

書籍の内容に関するお問い合わせはこちら。お答えできるのは本書に記載の内容に関することに限ります。

学校・法人一括購入に関するお問い合わせはこちらへ。

一括購入窓口

詳細

『まえがき』より

よいソフトウェアを記述するのは容易なことではありません。他のアプローチを使って何年も格闘してきた末に、私たちは関数型プログラミングに出会い、心を奪われました。関数型プログラミングのアプローチは他とは異なるものですが、その教義がプログラムを作成するための一貫した、合成可能な、美しい方法へといかにしてつながるのかを私たちは次第に理解するようになりました。
……中略……
自分たちの学習経験から、書きたい本のイメージは明確にあったので、すぐに簡単にできるだろうと考えていました。結局4年以上もかかったわけですが、よい本ができたと考えています。これは私たちが関数型プログラミングを学んでいたときにあればよかったと思える本です。私たちが関数型プログラミングに出会ったときの興奮が少しでも伝わることを願っています。

『本書に寄せて --- Martin Odersky Scala言語設計者』より

本書は深く考えさせる本です。細部への注意を促し、プログラミングに対するあなたの考え方を否定するかもしれないからです。本書を読み、推奨されている練習問題を解くことで、純粋関数型言語とは何か、その言語で何を表現できるか、それにはどのようなメリットがあるかについて理解を深めることができるでしょう。
本書に関して特に気に入っているのは、すべてがこの1冊に含まれていることです。可能な限り単純な表現から始まり、すべての抽象概念を詳しく説明した後、それらの上にさらに抽象概念を組み上げていきます。ある意味、表紙の向こうにScalaの別世界が展開します。その世界では、ミュータブルな状態は存在せず、すべての関数が純粋です。よく使用されるScalaライブラリは主に、関数型のインターフェイスを持ちながらも部分的に命令型の実装に基づいているため、この理想郷に少し似つかわしくありません。私の考えでは、ミュータブルな状態を関数型のインターフェイスにカプセル化できることは、Scalaの長所の1つです。しかし、その能力がよく誤用されることも事実です。それにはまって抜けられなくなっていることに気づいた場合は、本書が強力な毒消しになります。

著者プロフィール

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 関数型プログラミングの利点:単純な例
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.4 まとめ

第15章 ストリーム処理とインクリメンタルI/O
15.1 命令型I/Oの問題:例
15.2 単純なストリームトランスデューサ
15.3 拡張可能なProcess型
15.4 応用
15.5 まとめ

関連書籍

近日発売

やさしく学べる MySQL運用・管理入門【5.7対応】

「1レッスン45分」ですんなり身に付く!

好評発売中

OpenStack 構築手順書 Mitaka 版(Think IT Books)

OSSクラウドの大本命、OpenStack(Mitaka版)を構築しよう!

好評発売中

OpenStack-Ansible で作る HA 環境構築手順書 kilo版(Think IT Books)

OSSクラウドの大本命、OpenStackをAnsibleで構築しよう!

ダウンロード

本製品の読者さまを対象としたダウンロード情報はありません。

お詫びと訂正

誤記のためにご迷惑をおかけし、誠に申し訳ございません。

  • 0ページ xページのページ上部(6行目前後)のURL
    • [誤]https://github.com/fpinscala/fpinscla
    • [正]https://github.com/fpinscala/fpinscala
  • 52ページ EXERCISE 3.19の問題の1文目
    • [誤]与えられた述語条件が満たされるまでリストから要素を削除するfilter関数を記述せよ。
    • [正]与えられた述語条件を満たさない要素を削除するfilter関数を記述せよ。
  • 103ページ EXERCISE 6.1の1行目
    • [誤]Int.maxValue
    • [正]Int.MaxValue
  • 107ページ ページ末尾のコード行
    • [誤]else nonNegativeLessThan(n)(rng)
    • [正]else nonNegativeLessThan(n)(rng2)
  • 135ページ コードの下の本文1行目
    • [誤]_ + 1関数によるunit(1)へのマッピングが
    • [正]_ + 1関数によるunit(1)からのマッピングが
  • 163ページ EXERCISE 8.7の練習問題の2文目
    • [誤]結合は各ジェネレータから同じ値となる可能性があるものを取り出すという方法で行う。
    • [正]結合は各ジェネレータから等しい尤度で値を取り出すという方法で行う。
  • 187ページ ページ上部のコード
    • [誤]run(listOfN(3, "ab" | "cad"))("ababcad") == Right("ababcad")

      run(listOfN(3, "ab" | "cad"))("cadabab") == Right("cadabab")

      run(listOfN(3, "ab" | "cad"))("ababab") == Right("ababab")

    • [正]run(listOfN(3, "ab" | "cad"))("ababcad") == Right(List("ab","ab","cad"))

      run(listOfN(3, "ab" | "cad"))("cadabab") == Right(List("cad","ab","ab"))

      run(listOfN(3, "ab" | "cad"))("ababab") == Right(List("ab","ab","ab"))
  • 226ページ EXERCISE 10.13のコード2行目
    • [誤]case object Leaf[A](value: A) extends Tree[A]
    • [正]case class Leaf[A](value: A) extends Tree[A]
  • 232ページ ページ上部のコード3行目
    • [誤]def map[A,B](oa: Option[A])(f: A => B): Option[A]
    • [正]def map[A,B](oa: Option[A])(f: A => B): Option[B]
  • 255ページ exercise 12.1のコード3行目
    • [誤]fb: F[A]
    • [正]fb: F[B]
  • 255ページ exercise 12.2のコード5行目
    • [誤]def map2[A,B,C](fa: F[A], fb: F[B])(f: (A,B) => C): F[A]
    • [正]def map2[A,B,C](fa: F[A], fb: F[B])(f: (A,B) => C): F[C]

お問い合わせ

書籍の内容に関するお問い合わせはこちら。お答えできるのは本書に記載の内容に関することに限ります。

お問い合わせフォーム