駆け足で読む『プログラミングHaskell』4 関数定義

  • 関数は対応付けるもの
    • 対応付けは値と値かもしれないし、値と関数かもしれないし、関数と関数かもしれない
    • 対応づけは1度とは限らない(x -> y -> z -> wのように3つの対応づけもできる)
  • 関数が失敗することなく対応付けするためにHaskellで決まっているルール
    • 対応付けの対象(値と関数)は型を持つ
      • 関数は引数と返り値とに型定義がある
    • 値の対応づけは、全体集合に対して定義する
    • 多段階の対応づけの考え方にcurry化がある
      • x -> y -> zは2段階の対応づけだが、x -> (y -> z) と考えれば、x を (y -> z)に対応付けるという1段階の対応づけと考えてもよい。xが値で(y -> z)は関数。このように多段階の対応づけのとらえ方を1段階化することをcurry化と言う
  • 関数の型
f :: a -> b
    • 関数fの引数は型aを、返り値は型bを持つ
    • 特定の型を指定する場合
f :: Int -> Bool
    • などとする
    • 多相的な関数の場合は
f :: a -> a
    • のように任意の型を表すaを使う
    • 複数の型で定義したいが、一部のクラスに属する型のみに限定したいときは
f :: Num a => a
    • のように書く
  • 関数の値の対応づけは全体集合
    • 場合にわけて対応付けるときには、「場合、場合、…、それ以外のすべて」という形式で決めないと、全体集合を扱えない
    • 複数の場合分けの方法があるが、いずれも、「それ以外のすべて」をどうするかが決まっている
      • 条件式 if then else (elseを使うのが「それ以外のすべて」の扱い)
      • ガード付きの等式 ... otherwise (otherwiseを使うのが「それ以外のすべて」の扱い)
      • パターンマッチ "_"ワイルドカードを使う(適合条件を試した後でワイルドカードを使うと「それ以外のすべて」を取り扱うことになる)
  • その他の関数に関すること
    • λ式
      • 関数をきちんと書かずにかき捨てにするための方法
    • 2項演算子を取り扱うルール