『ふつうのHaskellプログラミング』詳細目次
$Id: toc.html,v 1.4 2006/06/26 17:15:05 aamine Exp $
本書の概要
- Haskellとは
- なぜHaskellか
- Haskellの利点(1)柔軟にプログラミングできる
- Haskellの利点(2)コンパイル時の型チェックが強力
- Haskellの利点(3)読みやすい
- Haskellの利点(4)遅延評価が基本
- Haskell 7つの壁
Haskell処理系の準備
- GHC
- Windowsでのインストール
- Linuxでのインストール
Hello, World!
- hello.hs
- ghcコマンド、runghcコマンド、ghciコマンド
- Windowsでのコンパイル
- Linuxでのコンパイル
- runghcコマンドでHello, World!
- ghciコマンドでHello, World!
- [column] Haskellのリファレンスマニュアル
本章のまとめ
チュートリアルの概要
mainアクションと関数適用
- hello.hs
- 変数の定義
- mainアクション
- 関数の適用
- 文字列リテラル
- hello.hsのまとめ
入出力の基本
- catコマンド
- cat.hs
- getContentsアクション
- putStr関数
- レイアウト
- do式
- 入出力と「<-」
- 変数の参照
- cat.hsのまとめ
- catコマンドの謎
- この節のまとめ
リスト処理の基本(1)countlineコマンド
- リスト
- リストリテラル
- countlineコマンド
- countline.hs
- 「$」演算子
- lines関数
- length関数
- print関数
- countline.hsのまとめ
- [column] 変数名の慣習について
リスト処理の基本(2)headコマンド
- headコマンド
- head.hs
- 2引数の関数適用
- 関数の定義
- firstNLines関数の定義
- unlines関数
- take関数
- head.hsのまとめ
リスト処理の基本(3)tailコマンド
- tailコマンド
- tail.hs
- reverse関数
- tail.hsのまとめ
本章のまとめ
練習問題
型と値
- 静的型チェックと型推論
- 基本的な型
- 関数の型
- 型変数
- 複数の型変数
- 型の宣言
- これまでに紹介した関数の型
高階関数
- 値としての関数
- 高階関数とは
- map関数
- expandコマンド
- expand.hsバージョン0
- if式
- 「==」演算子
- [column] 同一性と同値性
- expand.hsバージョン0のまとめ
- expand.hsバージョン1
- concat関数
- expand.hsバージョン1のまとめ
パターンマッチ(1)
- expand.hsバージョン2
- パターンマッチ
- concatMap関数
- replicate関数
- expand.hsバージョン2のまとめ
パターンマッチ(2)
- map関数
- リストに対するパターンマッチ
- 関数の再帰定義
- map関数の定義のまとめ
- map関数の適用
- [column] 再帰と高階関数
本章のまとめ
練習問題
コマンドライン引数の処理とモジュール
- echoコマンド
- echo.hs
- モジュールとimport宣言
- Mainモジュール
- Preludeモジュール
- unwords関数
- System.getArgsアクション
- echo.hsのまとめ
演習
- fgrepコマンド
- fgrep.hs
- mainアクションとfgrep関数の定義
- head関数
- tail関数
- filter関数
- fgrep関数とwhere節
- match関数の実装
- any関数
- List.tails関数
- List.isPrefixOf関数
- fgrep.hsのまとめ
- [column] もっと簡潔に書きたい
本章のまとめ
練習問題
遅延評価とは
- 評価とは
- 置き換えモデル
- 最内簡約と最外簡約
- グラフ簡約
- ifを関数として書く
- データ構造の遅延評価
- 遅延評価の限界
- 遅延評価とパターンマッチ
- [column] 参照透明性
遅延評価のシミュレーション
- myIf関数の評価
- map関数の評価
- map関数の評価に関する補足
遅延評価の利点と欠点
- 遅延評価の利点
- 利点(1)不要な計算を減らせる
- 利点(2)無限の長さのリストが扱える
- 利点(3)インターフェイスを統一できる
- 遅延評価の欠点
- 欠点(1)思った順番で操作を実行するのが難しい
- 欠点(2)デバッグしにくい
本章のまとめ
本章の構成
真偽値
- Bool型
- not関数
- (&&)関数
- (||)関数
数値
- 整数型
- 浮動小数点数型
- 数値の演算
- これ以外の数値型
文字と文字列
- 文字型
- 文字列型
- 文字に関する関数
- 文字種のテスト
- 大文字・小文字の変換
- 文字と整数との変換
タプル
- タプルとは
- ユニットとは
- タプルを扱う関数
- fst関数
- snd関数
- zip関数
- unzip関数
リスト
- リストとは
- 「:」演算子
- リストの数列表記
- リストに関する関数
- null関数
- (++)関数
- リスト内包表記
実習:cat -nコマンド
- cat -nコマンド
- catn.hs
- numbering関数の実装
- zipLineNumber関数の実装
- format関数の実装
- show関数
- rjust関数の実装
- catn.hsのまとめ
本章のまとめ
練習問題
コメント
- 1行コメント
- ブロック形式のコメント
- リテレイト形式
レイアウト
- ブレース構文
- レイアウト
- コードブロックのネスト
- 式の継続
if式
パターンマッチ
- パターンマッチとは
- さまざまなパターン
- 変数パターン
- 「_」パターン
- リテラルパターン
- タプルパターン
- リストパターン
- データコンストラクタによるパターン
- 「@」パターン
- ガード
- パターンマッチとガード
case 式
関数定義
- 関数の定義
- 識別子の規則
- 二項演算子の定義
- 二項演算子の規則
- 前置形式と二項演算子の変換
- 演算子の優先順位と結合性
- Haskellでの演算子優先順位と結合性
- 演算子優先順位と結合性の宣言
定義と束縛
- let式
- where節
- let式とwhere節の違い
- 変数のシャドウイング
- 定義中での相互参照
- パターン束縛
本章のまとめ
練習問題
値としての関数
- 関数束縛
- 高階関数
- 無名関数
- 無名関数と高階関数
- 無名関数でのパターンマッチ
関数合成
部分適用
- 部分適用とは
- Haskellでの関数と適用
- セクション
- セクションと(-)関数
- 部分適用の応用(1)──高階関数と部分適用
- 部分適用の応用(2)──変数の削減
ポイントフリースタイル
- ポイントフリースタイルとは
- ポイントフリーなhead.hs
- ポイントフリーなfgrep.hs(1)
- ポイントフリーなfgrep.hs(2)
- ポイントフリースタイルとコードの読みやすさ
本章のまとめ
練習問題
静的型チェックと型推論
- 型
- 静的な型チェック
- 型推論
- 型宣言
- 式に対する型宣言
- 多相型
代数的データ型
- 代数的データ型とdata宣言
- 構造体スタイル
- パターンマッチによるフィールドへのアクセス
- フィールドラベル
- セレクタ
- フィールドの更新
- 多相的な型の宣言
- 型コンストラクタとデータコンストラクタ
- 列挙型スタイル
- 共用体スタイル
- 再帰的な型
- 一般のdata宣言
- 代数的データ型の使用例
型の別名と付け替え
型クラス
- 型クラスとは
- 型クラスの例
- クラスメソッド
- 多重定義
- 型クラスの継承
- class宣言
- 継承を含むclass宣言
- instance宣言
- deriving宣言
- 主要な型クラス
- [column] 他言語の概念との比較
本章のまとめ
練習問題
モジュールの基本概念
- モジュールとは
- 基本的なモジュール
- 階層化ライブラリ
モジュールの定義とエクスポート
- module宣言
- エクスポートするエンティティの限定
- データコンストラクタのエクスポート
- モジュールのエクスポート
- Mainモジュール
インポート
- import宣言
- 特定エンティティのインポート
- 特定エンティティのインポート防止
- qualified構文
- as構文
- [column] Preludeモジュールの関数を隠す
本章のまとめ
モナドとは何か
Maybeモナド
- Maybeとは
- Maybeモナドの目的
- Maybeモナドの実例
- Maybeモナドの仕組み
- returnクラスメソッドの使い道
- [column] Monadクラスのインスタンスは型じゃない
リストモナド
- リストモナドの目的
- リストモナドの実例
- リストモナドの仕組み
IOモナド
- IOモナドの目的
- IOモナドと(>>=)
- IOモナドと(>>)
- 入出力以外でのIOモナド
モナドの構文
本章のまとめ
練習問題
第3部の目的
- Wikiとは
- Wikiを使ってみる
- なぜWikiを作るのか
- インストール
プログラムの概要
- HTTPとCGI
- 一番最初に決めること
- ポリシー
- 仕様
- 設計
- ファイル構成
- LazyLinesのコンパイル
CGIの処理
コントローラの実装
- 概要
- appMain関数
- WikiRequest型
- wikiRequest関数
- wikiSession関数
- respondTo関数
- viewPageResponse関数
モデルの実装
- 概要
- データベースの構造
- ページ名とファイルパスの対応
- ページの読み込み
- ページの保存
ビューの実装
- 概要
- fill関数(LazyLines.hs)
- fillTemplate関数
- fill関数(Template.hs)
- expand関数
本章のまとめ
本章の概要
- LazyLinesのWiki記法
- ブロック要素とインライン要素
- 実装の概要
HTMLの処理
- ハイパーリンクのパラメータ化
- HTML型を扱う関数
- HTML型から文字列への変換
- HTMLのエスケープ
インライン要素のパーサ
- Parsecライブラリとは
- Parsecを使ったインライン要素パーサ
- パーサの起動
- textパーサ
- 意味値
- WikiNameのパース
- URL自動リンクのパース
ブロック要素のパーサ
- Parsecによるブロック要素パーサ
- documentパーサ
- ブロック要素パーサの起動
- 見出し
- 箇条書き
- 段落
- List.intersperse関数
パーサコンビネータライブラリの実装
- パーサ型の宣言
- パーサの起動
- 入力1つをパースするパーサの実装
- firstChar関数の実装
- パーサの並びの実装
- (<|>)関数の実装
- many関数の実装
- many1関数の実装
- Parsecとの違い
本章のまとめ
Haskell言語
- Haskell言語について
- Haskellで書かれたアプリケーション
Haskellを使ったプログラム開発
ドキュメント
- A.1 コマンドライン入出力
- A.2 練習問題の解答例
- A.3 参考文献