ふつうのHaskellプログラミング
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/06/01
- メディア: 単行本
- 購入: 25人 クリック: 314回
- この商品を含むブログ (320件) を見る
本書の概要
- 第1章 Haskellプログラミングを始めよう
- 第2章 Haskellの基礎(1) 関数とリスト
- = による変数の定義
- アクション(action)
- Haskellプログラムとは、mainアクションを評価することである
- 「関数を呼び出す(call)」ではなく、「関数を適用する(apply)」
- do によるレイアウト(layout)、オフサイドルール(off-side rule)
- <- によって「変数を値に束縛する(bind)」
- 「変数を参照する(refer)」
- Haskellでは、配列ではなく、リスト(list)が基本的な型となる
- リストは常に空リスト(empty list)[]で終端される
- 文字列リテラルは文字のリスト
- 「$」演算子。関数型言語は()がネストしやすい。Haskellでは、この問題を解決するため、()の代わりに「$」演算子を利用できる
- 関数の定義
- 第3章 Haskellの基礎(2) 型と高階関数
- 型推論(type inference)
- -> による関数の型
- 型変数(type variable)による多相型。C++のテンプレートみたいなもの
- 型の宣言
- 関数名はすべて変数であり、関数に束縛される。変数としての関数名自身は、Cの関数ポインタみたいなもの
- 高階関数とは、他の関数を引数に取る関数。Cのqsort()みたいなもの
- if 条件式 then 式1 else 式2
- パターンマッチ
- Haskellには、for文やwhile文がない。リスト全体について繰り返す処理は、関数の再帰定義を利用する。ただし、普通は、自分で再帰定義する関数を記述することなく、標準ライブラリの高階関数を利用すれば事足りる
- 第4章 Haskellの基礎(3) モジュールと総合演習
- 「import モジュール名」で既存のライブラリをインポート
- main変数はMainモジュールに属する。モジュールの宣言を何も書かないと、そのファイル全体がMainモジュールとなり、main変数だけを公開すると見なされる
- 最も基本的な関数や型はPreludeモジュールに属する。Preludeモジュールはimport宣言を書かなくても利用可能
- where節。変数や関数のスコープを限定する
- 第5章 遅延評価
- 置き換えモデル(substitution model)とは、関数の適用を定義で置き換え、評価するモデル
- 簡約(reduction)とは、関数の適用を定義で置き換えること
- 遅延評価
- Haskellの遅延評価は最外簡約かつグラフ簡約によって実装される
- 必要な式だけが評価される。式は「パターンマッチ」または「組込み演算」が適用される際に「必要」となる
- 必要最小限のデータ構造のみ作成される。ゆえに論理的に無限の長さを持つリストを扱える
- 遅延評価の利点
- 最終的に必要な計算結果に必要な式のみ評価されるため、不要な計算を減らせる
- 無限リスト(inifinite list)を扱える
- さまざまな処理をリスト処理として、統一的に扱える
- 遅延評価の欠点
- 参照透明性(referential transparency)
- Haskellの置き換えモデルを支える性質
- 「同じ関数に同じ引数を与えると常に同じ値を返す」性質のこと
- 静的な内部変数への再代入があると参照透明性は失われる。すなわち、すべてのモジュールは内部状態を持たない
- 第6章 基本的な値
- 基本的な型
- 真偽値(Bool型)
- 数値(Int型、Integer型、Float型、Double型)
- 文字(Char型)
- 文字列(String型 = [Char]型)
- タプル((a, b)型)
- ユニット(()型)
- リスト([a]型)
- 基本的な型
組込み演算子
- Boolに関する関数
演算子名 | 型 | 凡例 | 意味 |
---|---|---|---|
(==) | a -> a -> Bool | x == y | xとyが等しいときにTrueを返す。詳しくは、同一性(メモリ上の同じアドレスを指している)ではなく、同値性(同じ値を記憶している)を返す |
(&&) | Bool -> Bool -> Bool | x && y | xとyがともにTrueのとき、Trueを返す。それ以外のとき、Falseを返す |
(||) | Bool -> Bool -> Bool | x || y | xかyのいずれかがTrueのとき、Trueを返す。それ以外のとき、Falseを返す |
- 数値に関する関数
演算子名 | 型 | 凡例 | 意味 |
---|---|---|---|
(+) | Int -> Int -> Int | x + y | xとyの和を返す |
ライブラリ関数
- Boolに関する関数
関数名 | 型 | 凡例 | 意味 |
---|---|---|---|
not | Bool -> Bool | not x | xがTrueならFalseを返す。xがFalseならTrueを返す |
- 文字に関する関数
関数名 | 型 | 凡例 | 意味 |
---|---|---|---|
putStr | String -> IO () | putStr cs | 文字列csを出力するアクションを返す |
putStrLn | String -> IO () | putStrLn cs | 文字列csと改行を出力するアクションを返す |
- リストに関する関数
関数名 | 型 | 凡例 | 意味 |
---|---|---|---|
length | [a] -> Int | length xs | リストxsの長さを返す |
take | Int -> [a] -> [a] | take n xs | リストxsの先頭からn個のみを含むリストを返す |
reverse | [a] -> [a] | reverse xs | リストxsを逆順にしたリストを返す |
concat | [ [a] ] -> [a] | concat xs | リストのリストxsの要素を連結して一重のリストを返す |
replicate | Int -> a -> [a] | replicate n x | xをn個だけ含むリストを返す |
lines | String -> [String] | lines cs | 文字列csを行ごとにリストに分割したリストを返す |
unlines | [String] -> String | unlines ss | 文字列のリストssを改行を挟んで連結した文字列を返す |
words | String -> [String] | words cs | 文字列csを空白文字ごとにリストに分割したリストを返す |
unwords | [String] -> String | unwords ss | 文字列のリストssを空白を挟んで連結した文字列を返す |
map | (a -> b) -> [a] -> [b] | map f xs | リストxsの各要素に関数fを適用したリストを返す |
concatMap | (a -> [b]) -> [a] -> [b] | concatMap f xs | concat $ map f xsと同意 |
filter | (a -> Bool) -> [a] -> [a] | filter f xs | リストxsの要素xのうち「f x」がTrueである要素を集めたリストを返す |
any | (a -> Bool) -> [a] -> Bool | any f xs | リストxsの要素xのうち「f x」がTrueになる要素があればTrueを返す |
head | [a] -> a | head xs | リストxsの最初の要素を返す |
tail | [a] -> [a] | tail xs | リストxsの第2要素以降を返す |
List.tails | [a] -> [ [a] ] | tails xs | リスト[xs,(tail xs),(tail (tail xs)),...]を返す |
List.isPrefixOf | (Eq a) => [a] -> [a] -> Bool | xs `isPrefixOf` ys | リストxsがリストysの先頭部分に一致するときTrueを返す |
List.sort | (Ord a) => [a] -> [a] | sort xs | リストxsの要素を昇順にソートしたリストを返す |
List.group | (Eq a) => [a] -> [ [a] ] | group xs | リストxsに連続して同じ要素が現れたら、それをまとめたリストを返す |
- その他の関数
関数名 | 型 | 凡例 | 意味 |
---|---|---|---|
(Show a) => a -> IO () | print x | 値xを出力するアクションを返す |
アクション
アクション名 | 型 | 凡例 | 意味 |
---|---|---|---|
getContents | IO String | cs <- getContents | 標準入力をすべて読み込む |
System.getArgs | IO [String] | ss <- getArgs | コマンドライン引数を読み込む |