ProgramHaskell

2022-01-15 (土) 公開
 Haskell入門 関数型プログラミング言語の基礎と実践
本間 雅洋
技術評論社
2017-09-27
¥3608


目次

はじめに

第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

著者

  • 本間雅洋(ほんままさひろ)
    株式会社フリークアウト所属。北海道苫小牧市出身。PerlとGo言語を使って広告システムを構築する傍らで,Haskellを普及させるべく機会をうかがっている。著書に「FFmpegで作る動画共有サイト(毎日コミュニケーションズ,共著)」,訳書に「実用Git(オライリージャパン,共訳)」,他Web媒体等での執筆多数。
    Twitter:@hiratara
    GitHub:hiratara
  • 類地孝介(るいちこうすけ)
    FIVE Inc.所属。Haskellを好み,Haskellの機能の実務上での意義を考え,それらをまとめてHaskell勉強会等で発表している。業務では主にScalaを書いている。
    Twitter:@ruicc
    GitHub:ruicc
  • 逢坂時響(おうさかときを)
    株式会社オンザロード所属。プログラマとして経験を積みながら独自にHaskellを学習し有用性を訴える。 lensやOperationalモナド等,抽象度の高い概念の活用や解説が得意。ブログやSNS,勉強会等を通して広くHaskellの普及活動を行っている。
    Twitter:@its_out_of_tune
    GitHub:tokiwoousaka

書評

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



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-01-15 (土) 14:21:44 (11d)