ふつうのHaskellプログラミング

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

本書の概要

  • 第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)とは、関数の適用を定義で置き換えること
      • 最内簡約(innermost reduction)とは、引数→関数の順に簡約する方法。C/C++Javaは最内簡約
      • 最外簡約(outermost reduction)とは、関数→引数の順に簡約する方法。Haskellは最外簡約。最外簡約によって簡約されることが遅延評価の特徴
      • グラフ簡約(graph reduction)とは、式を共有しながら簡約する方法。共有された式は評価されるのは一度だけ
    • 遅延評価
      • Haskellの遅延評価は最外簡約かつグラフ簡約によって実装される
      • 必要な式だけが評価される。式は「パターンマッチ」または「組込み演算」が適用される際に「必要」となる
      • 必要最小限のデータ構造のみ作成される。ゆえに論理的に無限の長さを持つリストを扱える
    • 遅延評価の利点
      • 最終的に必要な計算結果に必要な式のみ評価されるため、不要な計算を減らせる
      • 無限リスト(inifinite list)を扱える
      • さまざまな処理をリスト処理として、統一的に扱える
    • 遅延評価の欠点
      • 式が必要になるまで評価されないため、実行順序をコントロールしにくい。アクション(IOモナド)を利用すると実行順序をコントロール可能
      • 遅延評価されているプログラムはスタックのバックトレースが意味を成さないため、デバッグが難しい。ここは関数のテストで対処
    • 参照透明性(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に連続して同じ要素が現れたら、それをまとめたリストを返す
  • その他の関数
関数名 凡例 意味
print (Show a) => a -> IO () print x 値xを出力するアクションを返す

アクション

アクション名 凡例 意味
getContents IO String cs <- getContents 標準入力をすべて読み込む
System.getArgs IO [String] ss <- getArgs コマンドライン引数を読み込む