Haskell 教養としての関数型プログラミング

概 要

Haskellは、情報や論理を扱う上で非常に優れた特徴を持つ、関数型プログラミング言語です。本書は、知的好奇心を持ち、新しい考え方を身につけたいプログラマのために、Haskellを使った関数型プログラミングを体験しながら学ぶ入門書です。「対話環境に値をうちこむ」「かんたんな計算をしてみる」のように、ひとつずつ試しながらステップアップしていくため、プログラミング未経験者でも関数型プログラミングが理解できます。

著者 重城良国
価格 本体3400円(税別)
ISBN 978-4-7980-4806-2
発売日 2017/4/15
判型 B5変
ページ数 824
CD/DVD
ダウンロード
表紙イメージ
購入 アマゾンで購入する
楽天で購入する

※リンク先によっては、販売ページが用意されていないことがあります。あらかじめご了承ください。

新しいウィンドウで開く 書籍購入のご案内

サポート

サポート情報は以下からご参照下さい。

サポート情報へのリンク

目次

第0部 はじめに

第 i 章 ようこそ

i-1 プログラミングのいくつもの顔

i-2 あなたにはできる

第 ii 章 この本の楽しみかた

ii-1 誰のための本か

ii-2 前提とする知識・技術

ii-3 対象とするOS

ii-4 はじめから順に

ii-5 プログラミングを、学んだことのない人は

ii-6 言葉の説明

ii-7 「やってみよう」

ii-8 わからないときは

ii-9 索引について

ii-10 サンプルコード

ii-11 凡例

ii-12 それぞれの章の説明

第 iii 章 教養としての関数型プログラミング

iii-1 美しくて、豊かな世界

iii-2 思考の幅をひろげよう

第 iv 章 個人的な話

iv-1 数学への興味

iv-2 蛍の光、窓の雪

iv-3 高校時代

iv-4 自分専用のコンピュータ

iv-5 大学生がOSを作った

iv-6 言語遍歴

iv-7 Haskellとの出会い

iv-8 関数型言語だった

第 v 章 関数型プログラミングは常識になる

v-1 2進法を、知らなかったとしたら

v-2 いま、進化はここで

第 vi 章 謝辞

第Ⅰ部 関数型プログラミング

第1章 古くて新しい、関数型プログラミング

1-1 関数型プログラミングの血統は、コンピュータより古い

1-2 学問の世界とプログラミング

1-3 処理が複雑になると、きちんとした理論が必要になる

第2章 関数型プログラミングの特徴

2-1 関数型プログラミングって何?

2-2 ターミナル

2-3 エディタ

2-4 Rubyの導入

2-5 関数型プログラミングの意味するもの

2-6 「関数型プログラミング」のふたつの方向

2-7 動作の実行と式の評価

2-8 第1級関数

2-9 参照透過性

2-10 遅延評価

2-11 静的型付け

第3章 Haskellを学ぶ/Haskellで学ぶ

第Ⅱ部 関数と型

第4章 Haskellを学ぶための環境を作る

4-1 Stackとは

4-2 Stackの導入

4-3 GHCの確認

第5章 関数

5-1 ブラックボックス

5-2 GHC入ってる?

5-3 学習用環境のダウンロード

5-4 コンパイラとの対話

5-5 関数を作る

5-6 部分適用

5-7 関数リテラル

5-8 高階関数

5-9 演算子

5-10 Bool値

5-11 Maybe値

5-12 パターンマッチ

5-13 ガード

5-14 関数の槍

第6章 型

6-1 型って?

6-2 関数の型

6-3 型宣言

6-4 型注釈

6-5 型駆動開発

6-6 モジュールの読みこみ

6-7 型の盾

第7章 多相関数

7-1 多相関数とは

7-2 Maybe値のなかみを取り出す

7-3 Maybe値の、なかみをあつかう

7-4 Let it be!

7-5 値を無視する

7-6 関数適用

7-7 関数合成

7-8 引数を入れかえる

7-9 ふたつの引数に、おなじ関数を適用

7-10 いろいろな多相関数があったね

7-11 多相の紋章

第8章 関数と型のまとめ

8-1 ここまでの復習

8-2 関数

8-3 型

8-4 多相関数

8-5 演算子($)の連続を、(.)に置き換える

第Ⅲ部 タプル、リスト、再帰

第9章 タプル

9-1 原点からの距離

9-2 型変換

9-3 カリー化

9-4 非カリー化

9-5 タプルの構文糖

9-6 タプルの籠手(こて)

第10章 リストによる「くりかえし」

10-1 列挙と集計

10-2 ろ過

10-3 写像

10-4 列挙、ろ過、写像、集計

10-5 「くりかえし」の空間効率

10-6 データ構造としてのリスト

10-7 無限リスト

10-8 リストの兜

第11章 演習: モンテカルロ法

11-1 モンテカルロ法とは

11-2 2種類の整数型

11-3 ローカル変数を使う

11-4 疑似乱数列の生成

11-5 さあ、モンテカルロ法だ

11-6 リストだけで、ここまでできた

第12章 ここまでの補足

12-1 ローカル変数を、あとで定義する

12-2 case式

12-3 if式

12-4 関数fstとsnd

12-5 型シノニム

12-6 関数bool

12-7 Maybe値にたいするmap関数

12-8 レイアウトルール

第13章 再帰関数の基本

13-1 再帰関数とは

13-2 ライプニッツの公式

13-3 二分木を、したにたどる

第14章 リストをとる再帰関数

14-1 パターンマッチ

14-2 総和

14-3 総積

14-4 長さ

第15章 たたみこみ

15-1 右からたたみこむ

15-2 左からたたみこむ

15-3 たたみこみの空間効率を、改善する

15-4 ポーランド記法電卓

15-5 ポーランド記法電卓と、右たたみこみ

15-6 逆ポーランド記法電卓

15-7 逆ポーランド記法電卓と、左たたみこみ

15-8 右たたみこみ関数の引数を入れかえる

15-9 関数foldr

第16章 リストをかえす再帰関数

16-1 整数を数えあげる

16-2 コラッツの予想という未解決問題

16-3 つぎつぎに関数を適用する

16-4 素因数分解

16-5 状態を変えながら、リストを作っていく

16-6 リストをとる関数でもあり、かえす関数でもある

第17章 リストの再帰的定義

17-1 パターンマッチを2重にする

17-2 ふたつのリストを、関数でとじあわせる

17-3 フィボナッチ数列

第18章 リストをあつかう標準的な関数

18-1 この章で、あつかう関数

18-2 関数map

18-3 関数filter, partition

18-4 関数take, drop, splitAt

18-5 関数takeWhile, dropWhile, span

18-6 関数zip、zipWith、unzip

18-7 関数(++), concat, reverse

18-8 関数repeat, replicate, cycle

18-9 リストをあつかう標準的な関数を、自分で定義してみた

18-10 再帰の刃(やいば)

第19章 リスト内包表記

19-1 リスト内包表記とは

19-2 写像の、もうひとつの表現

19-3 写像して、すべて結合する関数

19-4 関数concatMapの、もうひとつの表現

19-5 写像して、すべて結合する関数で、ろ過関数を定義する

19-6 リスト内包表記でのろ過

19-7 リスト内包表記におけるパターンマッチ

19-8 リスト内包表記は便利だ

第20章 演習: 構文解析

20-1 何を作るか

20-2 基本的な関数

20-3 リストの構文解析

20-4 数の並びの構文解析

20-5 計算機

20-6 パーサコンビネータを作った

第Ⅳ部 代数的データ型と型クラス

第21章 代数的データ型

21-1 トランプの、スートと色

21-2 値を見る

21-3 人間と商品

21-4 直交座標と極座標

21-5 点は点だ

21-6 値構築子のふたつの顔

21-7 値構築演算子

第22章 多相的な再帰的な、代数的データ型

22-1 多相型

22-2 タプル

22-3 Maybe型

22-4 Either型

22-5 再帰的な型

22-6 再帰的な多相型

22-7 リスト

第23章 レコード構文

23-1 円

23-2 構文

23-3 長方形のふたつの定義

23-4 レコード構文をうまく使おう

23-5 やってみよう

第24章 代数的データ型とモジュール

24-1 代数的データ型の導入

24-2 モジュールの作成

24-3 代数的データ型の公開

24-4 代数的データ型の鎧

第25章 演習:NML(Nano Markup Language)

25-1 仕様

25-2 文字列をNMLとして読みこむ

25-3 ほかの型への変換

25-4 ほかの型からの変換

25-5 Nml型の値を、文字列にする

25-6 簡易的な値の読みこみ

25-7 かんたんな、入出力

25-8 単独動作するプログラム

25-9 単独動作する、変換コマンド

第26章 型クラス

26-1 条件分岐をわかりにくくする

26-2 真偽値のようなもの

26-3 単純な型を、真偽値のようなものにする

26-4 そのばしのぎの、多相関数

26-5 複合的な型を真偽値のようなものにする

26-6 おなじだけど、ちがう型

26-7 仕様と実装とを、わける

26-8 クラス関数の定義は、こちらで用意しておきました

第27章 基本的な型クラス

27-1 ドリンクのサイズ

27-2 おなじか、ちがうか

27-3 小さいか、大きいか

27-4 演算子の結合力・結合性

27-5 差分リスト

27-6 表示できる

27-7 範囲がある

27-8 数えあげられる

27-9 性質を自動的に

27-10 数である

27-11 型クラスの椅子

第Ⅴ部 高階型

第28章 型の種類

28-1 種類(kind)とは

28-2 * -> *種の型にたいする型クラス

第29章 モノイド

29-1 モノイドとは

29-2 いろいろなモノイド

29-3 リストの要素すべてを、演算でつなぐ

29-4 右たたみこみとモノイド

29-5 結合則を満たし、単位元がある演算をもつものが、モノイドだ

第30章 ファンクタ

30-1 なかみを変換する

30-2 ファンクタをあらわす型クラス

30-3 ファンクタ則

30-4 ファンクタとしてのリスト、Maybe値、木

30-5 使いみち

30-6 コンテナでないファンクタ

30-7 構造を変えずになかみの変換をする

第31章 関数を変形する

31-1 どうして、関数を変形するの?

31-2 高階関数なの?多引数関数なの?

31-3 情報をもたない値

31-4 「値を引数とする関数」を、引数とする関数

31-5 1引数関数の、引数と返り値にたいする、引数の追加と削除

31-6 2引数関数の、引数と返り値にたいする、引数の追加と削除

31-7 関数を変形する、やりかたを見た

第32章 モナドという性質

32-1 つなぐ

32-2 失敗するかもしれない関数を、つなぐ

32-3 メモリ機能つき電卓を、エミュレートする

32-4 共通するわくぐみ

第33章 モナドとファンクタ

33-1 モナドであれば、かならずファンクタでもある

33-2 モナドにはできるけど、ファンクタにはできないこと

第34章 アプリカティブファンクタ

34-1 アプリカティブファンクタの発見

34-2 アプリカティブファンクタにはするが、モナドにはしない

34-3 アプリカティブファンクタをあらわす型クラス

第35章 モナドをあらわす型クラス

35-1 型クラスの定義

35-2 いろいろなモナド

35-3 「モナドである」という性質をもつ型を、型クラスでまとめた

35-4 モナドを、あまくする

35-5 いくつかの可能性のある計算

35-6 モナド内包表記

第36章 モナドを身につける

36-1 計算のログをとる

36-2 檻のなかのライオン

36-3 ファンクタ、アプリカティブファンクタ、モナド

36-4 モナドの鞍

第37章 モナドとリスト

37-1 状態モナド

37-2 複数のモナドをつなぐ

37-3 モナドの、返り値を捨てる

37-4 文脈をつける関数を、すべての要素に適用した

第Ⅵ部 入出力

第38章 IOモナド

38-1 入出力の例

38-2 入出力と純粋性

38-3 単純な機械

38-4 入力と出力の、型を指定する

38-5 ふつうの関数と機械をつなぐ

38-6 1秒ごとに、あいさつを変える

38-7 機械を巧妙につなぐ

38-8 単純にする

38-9 機械を、モナドのわくぐみでつないだ

38-10 愛馬イオ

第39章 IOモナドを身につける

39-1 「あまさ」の調節

39-2 Hello, world!

39-3 はじめまして

39-4 たし算

39-5 総和をもとめる

39-6 数あてゲーム

39-7 タイピングゲーム

39-8 入出力が身についた

第40章 演習: ライフゲーム

40-1 ファイルを読みこむ

40-2 すこし眠る

40-3 ライフゲームとは

40-4 仕様

40-5 開発用ディレクトリを作る

40-6 モジュールを導入する

40-7 ボードの読みこみと、書きだし

40-8 生命の、初期配置のサンプル

40-9 補助的な関数

40-10 まえ、ここ、あと

40-11 まわりの値

40-12 まわりの値から、つぎの値をもとめる

40-13 初期値から、無限リストを作る

40-14 ファイルと世代数を決めて実行する

40-15 生命のうごめき

40-16 エラー処理について

40-17 ライフゲームを作った

第Ⅶ部 補足

第41章 並べられる

41-1 わかれみちゲーム

41-2 リストのたたみこみ

41-3 二分木のたたみこみ

41-4 「たたみこめる」という性質

41-5 型クラスFoldableと、わかれみちゲーム

41-6 リストをとる関数を、一般化する

41-7 リストも二分木も、並べられる

第42章 並べるときに、構造を覚えておく

42-1 二分探索木をチェックする

42-2 構造を覚えながら、並べる

第43章 どっちでもいい

43-1 スーパーヨシオ

43-2 「どっちでもいい」という性質

第44章 演習:構文解析を、アプリカティブファンクタのわくぐみで

44-1 何を作るか

44-2 基本的な関数

44-3 リストの構文解析

44-4 数の並びの構文解析

44-5 計算機

44-6 構文解析にアプリカティブファンクタのわくぐみを使った

第Ⅷ部 おわりに

第45章 まとめ

45-1 関数

45-2 型

45-3 多相関数

45-4 タプル

45-5 リストによる「くりかえし」

45-6 追加の構文

45-7 再帰関数の基本

45-8 リストをとる再帰関数

45-9 たたみこみ

45-10 リストをかえす再帰関数

45-11 リストの再帰的定義

45-12 リストをあつかう、標準的な関数

45-13 リスト内包表記

45-14 代数的データ型

45-15 多相的な再帰的な、代数的データ型

45-16 レコード構文

45-17 代数的データ型とモジュール

45-18 型クラス

45-19 基本的な型クラス

45-20 型の種類

45-21 モノイド

45-22 ファンクタ

45-23 関数を変形する

45-24 モナドという性質

45-25 モナドとファンクタ

45-26 アプリカティブファンクタ

45-27 モナドをあらわす型クラス

45-28 IOモナド

45-29 並べられる

45-30 並べるときに構造を覚えておく

45-31 どっちでもいい

45-32 おさらいしました

第46章 つぎに何をするか

46-1 読んでくれて、ありがとう

46-2 型クラスはまだまだある

46-3 入出力にまつわるエトセトラ

46-4 アルゴリズム

46-5 いろいろなデータ構造

46-6 コーディングの実践で必要なこと

46-7 GHCを研究する

46-8 言語拡張を学ぶ

46-9 理論的なあれこれ

第47章 さあ、とびたとう

補足資料

補足資料A 遅延評価で遅延リストを実現する

A-1 型なしHaskell

A-2 高階関数で対を作る

A-3 対としてのリスト

A-4 無限リスト

A-5 正格評価で無限リストは使えるか

A-6 遅延評価で無限リストは使えるか

A-7 関数としてのリスト

A-8 Haskellで試す

補足資料B モナド則から、モノイダル則を導く

B-1 モナド則が成り立てば

B-2 モナド則から、モノイダル則を導く

補足資料C 「なかみに関数を適用する関数」はひとつ

補足資料D 個人的なコーディングスタイル

D-1 字下げ

D-2 スペース

D-3 1行の幅

D-4 演算子と改行

D-5 変数名

D-6 演算子($)の連続

D-7 複数の関数をまとめて型宣言するとき

D-8 where節

D-9 let-in式

D-10 ワイルドカードを使う/使わない

D-11 モジュールの導入

補足資料E レイアウトルールの、正確な仕様

E-1 前処理

E-2 関数L

E-3 <n>

E-4 {n}

E-5 }

E-6 {

E-7 パースエラー

E-8 そのまま

E-9 ファイルのおわり

補足資料F 言葉の説明

0 - 9

B

C

D

E

G

H

J

L

M

N

O

P

Q

R

S

T

U

V

W

X

Z

あ - お

か - こ

さ - そ

た - と

な - の

は - ほ

ま - も

ら - ろ

PR

秀和システム