ProgramHaskell

2022-01-15 (土) 公開

Haskell入門 関数型プログラミング言語の基礎と実践

#html{{

table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4774192376/vertex9-22/" target="_blank"><img src="https://m.media-amazon.com/images/I/41xoNsYARcL._SL160_.jpg" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4774192376/vertex9-22/" target="_blank">Haskell入門 関数型プログラミング言語の基礎と実践</a><br>本間 雅洋<br>技術評論社<br>2017-09-27<br>¥3608</td></tr></table>
}}

目次

はじめに

第1章 はじめてのHaskell

 1.1 Haskellの特徴
   【Column】 Haskellの歴史
  1.1.1 関数型プログラミング言語
   【Column】 ラムダ計算
  1.1.2 静的型付け
   【Column】 静的型付けの限界
  1.1.3 純粋性
  1.1.4 型推論
  1.1.5 遅延評価

 1.2 実行環境の構築
  1.2.1 GHC
  1.2.2 Stack
   【Column】 その他の導入方法
   【Column】 Windowsインストール時の注意点
   【Column】 CabalとStack

 1.3 REPLとスクリプトの実行
  1.3.1 REPLを使う
  1.3.2 Haskellスクリプトの実行
  1.3.3 REPLにスクリプトを組み込む
   【Column】 グローバルプロジェクト
   【Column】 resolverのバージョン

 1.4 プロジェクト作成とビルド
  1.4.1 プロジェクトの作成
  1.4.2 プロジェクトのビルドと実行
   【Column】 単体テスト
   【Column】 プロジェクト内でREPL

第2章 基本の文法

 2.1 文法の特色
  2.1.1 手続き型言語と関数型言語
  2.1.2 式だけで意味あるプログラムをつくる

 2.2 基本のデータ型
  2.2.1 数値
   【Column】 その他の数値
  2.2.2 真偽値
  2.2.3 文字・文字列
   【Column】 文字表記のTIPS
   【Column】 文字のコードポイント
  2.2.4 Unit型
  2.2.5 I/Oアクション
   【Column】 I/Oアクションとモナド
  2.2.6 ボトム
   【Column】 ボトムの使いどころ

 2.3 変数
  2.3.1 変数の宣言方法
   【Column】 インデントとレイアウトルール
   【Column】 do式におけるlet
   【Column】 変数の命名

 2.4 関数
  2.4.1 関数の定義
   【Column】 左右結合
  2.4.2 カリー化
   【Column】 カリー化されていない多引数関数
  2.4.3 関数の型の読み方
   【Column】 ポイントフリースタイルによる可読性の悪化
  2.4.4 遅延評価と非正格性
   【Column】 非正格な関数の例
   【Column】 先行評価の強制
  2.4.5 中置演算子
   【Column】 中置以外の演算子

 2.5 main 関数とdo 式
   【Column】 do式の記法
   【Column】 Debug.Trace

 2.6 条件分岐とパターンマッチ
  2.6.1 if式
  2.6.2 パターンマッチ
  2.6.3 ガード節
  2.6.4 case式以外でのパターンマッチ

 2.7 データ構造
  2.7.1 リスト
  2.7.2 タプル型
  2.7.3 Maybe a型
  2.7.4 Either a b型

 2.8 ループの実現
  2.8.1 再帰的な定義
  2.8.2 リストの利用
   【Column】 forM_を用いたリスト操作

 2.9 モジュールとパッケージ
  2.9.1 モジュール
   【Column】 REPLでモジュールを読み込む
   【Column】 モジュールのwhere
   【Column】 Preludeのモジュールの読み込み規則
  2.9.2 モジュール内の識別子
  2.9.3 パッケージ
   【Column】 Stackの--packageオプション
   【Column】 パッケージのバージョニング
   【Column】 コメント
   【Column】 Haddock

第3章 型・型クラス

 3.1 型の記述

 3.2 型システム
  3.2.1 型チェック
  3.2.2 多相性
  3.2.3 型推論
   【Column】 型推論と型の明記

 3.3 型コンストラクタと型変数
  3.3.1 型の組み立て
  3.3.2 型変数

 3.4 代数的データ型
  3.4.1 データコンストラクタ
  3.4.2 データコンストラクタ名の規則
  3.4.3 異なる形式のデータから選択
  3.4.4 正格性フラグ
  3.4.5 Preludeにおける代数的データ型

 3.5 レコード記法
  3.5.1 フィールドへのアクセス
  3.5.2 フィールドの値の差し替え
   【Column】 代数的データ型の定義で生成される識別子

 3.6 再帰的な定義
  3.6.1 二分木による辞書
   【Column】 代数的データ型としてのリスト

 3.7 型の別名
  3.7.1 type
  3.7.2 newtype

 3.8 型クラス
  3.8.1 型クラスの例
  3.8.2 用語の注意点
  3.8.3 型クラスとインスタンスの定義
  3.8.4 型クラスとカインド
   【Column】 プロンプトの省略表記
  3.8.5 Monoid型クラス

 3.9 型制約
  3.9.1 型への型制約
  3.9.2 class宣言における型制約
  3.9.3 instance宣言における型制約
  3.9.4 型変数の曖昧性
   【Column】 型制約の制限

 3.10 Preludeにおける型クラス
  3.10.1 ShowとRead
  3.10.2 比較演算子
  3.10.3 Enum型クラス
   【Column】 Enum型クラスとChar型
  3.10.4 数値計算の型クラス
  3.10.5 derivingによるインスタンス定義

第4章 I/O処理

 4.1 IO 型
  4.1.1 IO型と純粋な関数
  4.1.2 I/Oアクションの組み立て
  4.1.3 bind・return・do式

 4.2 コマンドライン引数と環境変数
  4.2.1 コマンドライン引数
  4.2.2 環境変数の取得
  4.2.3 環境変数の設定

 4.3 入出力
  4.3.1 標準入出力関数
   【Column】 標準入力とBufferMode
  4.3.2 ファイル操作
  4.3.3 標準入出力の遅延I/O
   【Column】 ファイル読み込みの遅延I/O
  4.3.4 Handleを用いたI/O操作
  4.3.5 バイナリ操作

 4.4 ファイルシステム
  4.4.1 ファイルやディレクトリの基本操作
   【Column】 特殊なディレクトリ
   【Column】 相対パスと絶対パス
  4.4.2 権限情報
   【Column】 検索関数
   【Column】 Windowsの実行ファイル対策

 4.5 例外処理
   【Column】 I/O以外の処理から発生する例外
  4.5.1 例外処理の基本
  4.5.2 例外に対する特殊な操作
  4.5.3 独自の例外を定義する
   【Column】 POSIXとWin32

第5章 モナド

 5.1 モナドアクション
  5.1.1 Monad型クラス
  5.1.2 Maybe型クラス
  5.1.3 State sモナド
   【Column】 State sモナドから必要な値だけを取り出す
   【Column】 ランダムに並び替える

 5.2 Monadの性質を利用する
  5.2.1 Monadによる強力な関数

 5.3 FunctorとApplicative
  5.3.1 Functor
  5.3.2 Applicative
  5.3.3 Alternative型クラスとしてのMaybe

 5.4 Either eモナドとExcept eモナド
  5.4.1 Either eモナド
  5.4.2 Except eモナド

 5.5 Reader rモナド
  5.5.1 Reader rモナドの利用

 5.6 ST sモナド
  5.6.1 ミュータブルな変数
  5.6.2 ミュータブルな配列
   【Column】 ST sモナドの仕組み

 5.7 リストモナド
  5.7.1 Alternative型クラスとしての[]
  5.7.2 リストの内包表記
   【Column】 failの振る舞い
   【Column】 その他のモナド

 5.8 モナド変換子
  5.8.1 モナド変換子とlift
  5.8.2 モナド変換子の利用
  5.8.3 モナド変換子とdo式
   【Column】 モナド変換子の合成順序
  5.8.4 モナドとモナド変換子
  5.8.5 I/Oアクションの持ち上げ
  5.8.6 複雑な操作の持ち上げ

第6章 関数型プログラミング

 6.1 型とプログラミング
  6.1.1 問題を型で表現する
  6.1.2 ADTによる表現
   【Column】 遅延リストによってもたらされるミス
   【Column】 Haskellを使うときに参考にすべきドキュメント

 6.2 関数による抽象化
  6.2.1 テンプレート型プログラミング
   【Column】 リソースの取り扱い
   【Column】 コピペの危険性
  6.2.2 Haskellのスタイル
   【Column】 高階関数との付き合い方
   【Column】 関数抽象化によるパフォーマンス問題

 6.3 代入文と変数の局所性
  6.3.1 変数とスコープ
  6.3.2 再代入不可の変数

 6.4 型クラスと拡張性
  6.4.1 インスタンス宣言の独立
   【Column】 Haskell以外の言語の拡張性の問題点
  6.4.2 特定のモナドインスタンスを抽象化した型クラス
   【Column】 FunctionalDependenciesによる制約

第7章 ライブラリ

 7.1 標準ライブラリ
  7.1.1 Prelude
  7.1.2 Data.Bits
  7.1.3 Data.Char
  7.1.4 Data.List
  7.1.5 Data.Array
  7.1.6 その他のHaskell標準ライブラリ

 7.2 GHCに付属するライブラリ
  7.2.1 Data.Map.Strict
  7.2.2 Data.Set

 7.3 効率的な文字列操作 ─ ByteString・Text
  7.3.1 ByteStringの利用
  7.3.2 Textの利用
   【Column】 文字列の高度な操作

 7.4 高速にランダムアクセス可能な配列 ─ vector
  7.4.1 Vectorの基本
  7.4.2 配列に対する破壊的操作
   【Column】 MVectorの型
  7.4.3 VectorとMVectorの変換
   【Column】 UnboxedなVectorを使う

 7.5 高速なパーサ ─ attoparsec
  7.5.1 パーサコンビネータなしに日付を分解する
  7.5.2 パーサコンビネータ
  7.5.3 Applicativeスタイル
  7.5.4 パースエラーの情報
  7.5.5 足し算のパーサを作る
   【Column】 他のパーサコンビネータライブラリ

 7.6 型安全なJOSN 操作 ─ aeson
  7.6.1 aesonの利用
  7.6.2 JSONのデータ構造を直接操作する
  7.6.3 Optionsによる制限の回避
   【Column】 インスタンスの自前実装
   【Column】 Genericsの利用

 7.7 日付・時刻を扱う ─ time
  7.7.1 現在のシステム日時を取得する
  7.7.2 日時の計算
  7.7.3 日付と時刻の型

 7.8 複雑なデータ構造への効率的なアクセス ─ lens
  7.8.1 Lensを使う
  7.8.2 Lensアクセサによるデータの取り出し
  7.8.3 Lensアクセサを作成する
   【Column】 State sモナドとLens
   【Column】 Prismによるデータアクセス

 7.9 モナドによるDSLの実現 ─ operational
  7.9.1 APIを列挙する
  7.9.2 アクションの動作を記述する

 7.10 ストリームデータ処理 ─ pipes
  7.10.1 pipesの実用例
  7.10.2 ストリームデータに対する処理を書く
  7.10.3 ProducerとConsumerの作成

第8章 並列・並行プログラミング

 8.1 並列と並行
  8.1.1 それぞれの処理の目的
  8.1.2 スレッドを用いたプログラムの実行

 8.2 MVarによるスレッド間の通信
  8.2.1 スレッドの生成
  8.2.2 MVarの利用
  8.2.3 複数スレッドからアクセス

 8.3 STM によるスレッド間の通信
  8.3.1 スレッド処理とデッドロック
  8.3.2 STMによるトランザクション

 8.4 非同期例外
  8.4.1 非同期例外と純粋関数
  8.4.2 非同期例外とマスク
  8.4.3 非同期例外とSTM

 8.5 より安全な非同期 ─ async
  8.5.1 基本の利用
  8.5.2 より安全に書く
  8.5.3 同期例外と非同期例外の区別 ― safe-exceptions

 8.6 並列性を実現するライブラリ
  8.6.1 parallelパッケージ
  8.6.2 monad-parパッケージ

第9章 コマンドラインツールの作成

 9.1 開発の準備
  9.1.1 アプリケーションの概要・仕様
  9.1.2 プロジェクトの作成
  9.1.3 ディレクトリ構成

 9.2 HUnit による自動テスト
  9.2.1 cabalファイルの編集
  9.2.2 基本テスト
   【Column】 -Wallオプション
  9.2.3 複数テストの記述
   【Column】 QuickCheck

 9.3 パーサの作成
  9.3.1 フィルタのデータ定義とテスト
  9.3.2 フィルタ文字列とパーサを書く
  9.3.3 クエリのデータ定義とパーサ

 9.4 クエリの実行とIO 処理
  9.4.1 lens-aesonによるJSON操作
  9.4.2 フィルタの実行関数
  9.4.3 クエリの実行関数
   【Column】 Haskellらしいスタイルで書く
  9.4.4 処理のまとめとI/O

 9.5 まとめ

第10章 Webアプリケーションの作成

 10.1 Web アプリケーション環境の選定
  10.1.1 アプリケーションサーバ
  10.1.2 Webアプリケーションフレームワークの選定
  10.1.3 選定技術の一覧

 10.2 開発の準備
  10.2.1 Webサービスの概要・仕様
  10.2.2 プロジェクトの作成
  10.2.3 パッケージの追加
  10.2.4 テーブル定義
  10.2.5 URL設計
  10.2.6 ディレクトリ構成と全体像

 10.3 モデルの開発
  10.3.1 HDBCによるDB接続
  10.3.2 HRRの導入
   【Column】 メタパッケージの活用
  10.3.3 RDBMSと対応するデータ型の定義
   【Column】 自動生成時の追加指定
  10.3.4 SQLの生成
  10.3.5 モデルの実装

 10.4 コントローラの開発
  10.4.1 コア機能の定義
  10.4.2 各種操作の実装
  10.4.3 体重入力の実装

 10.5 ビューの開発
  10.5.1 mustacheパッケージ
  10.5.2 テンプレートファイルの保存先
  10.5.3 トップ画面の実装
  10.5.4 メイン画面の作成

 10.6 実行ファイルの作成
  10.6.1 ルーティング
  10.6.2 アプリケーション本体の完成
  10.6.3 Mainモジュールの実装
  10.6.4 ビルドと実行

 10.7 まとめ

第11章 サーバとクライアントの連携

 11.1 開発の準備
  11.1.1 サービスの概要・仕様
  11.1.2 プロジェクト作成

 11.2 クライアント・サーバシステムの簡易実装
  11.2.1 GADTs
  11.2.2 簡易実装の作成
  11.2.3 サーバサイドの実装
  11.2.4 クライアントの実装
   【Column】 GADTsによる実装の考察

 11.3 オークションシステムの構築
  11.3.1 APIの定義
  11.3.2 サーバサイドの実装
   【Column】 深いインデントは悪か
  11.3.3 オークション進行の実装
  11.3.4 supervisorとロガー
  11.3.5 サーバの完成と起動

 11.4 オークションシステムのクライアントプログラム
  11.4.1 クライアントサイドの実装
  11.4.2 対話型クライアント
   【Column】 ボット型クライアント

 11.5 まとめ

索引

出版社

Haskell入門 関数型プログラミング言語の基礎と実践:書籍案内|技術評論社
https://gihyo.jp/book/2017/978-4-7741-9237-6

著者

書評

本書を参考にして、HaskellでWebアプリを作ってみたいです。


#html{{

center><a href="http://px.a8.net/svt/ejp?a8mat=1O73NW+3B2PRM+D8Y+BXB8X" target="_blank"><img border="0" width="468" height="60" alt="" src="http://www21.a8.net/svt/bgt?aid=101108300200&wid=001&eno=01&mid=s00000001717002003000&mc=1"></a><img border="0" width="1" height="1" src="http://www18.a8.net/0.gif?a8mat=1O73NW+3B2PRM+D8Y+BXB8X" alt=""></center>
}}


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS