読者です 読者をやめる 読者になる 読者になる

関数プログラミング実践入門 【読書記録 3章】

  • 関数について
  • 関数の一部だけに引数を与えたり,セクションを利用して2項演算子の一部のみに引数を与えたりすることができる.これを部分適用と言う
  • Haskellでは関数がカリー化されているので,すべての関数は1引数関数であり,値になるまで複数引数を要する関数であっても,1つ引数を与えると,残りの引数を待つ関数になる.
  • ファイル中に書いた関数をGHCiの中で使うには:l sample.hsのようにする.リロードするときは:r,外したいときは:m -Mainのようにする.
  • パターンマッチにおけるパターンとは,「どのコンストラクタで作られたか」である
  • マッチするということは,値が実際に「そのパターンのコンストラクタで作られていた」
  • パターンマッチは「コンストラクトの逆計算」
  • Haskellでは実行時にエラーが発見されることは著しく望まれない現象
  • 網羅的でないパターンマッチは書くべきではない
  • 何か値はあるけど,束縛は行わないものに対しては,アンダースコア,_ でマッチさせることができる.これをプレースホルダーと言う.実際は,アンダースコアで始まっていればよいので_xsでも大丈夫.
  • Haskellでは入力に関係なく満たされるガード条件があるかどうか,つまりotherwiseがあるかどうかという点で,厳密な網羅性の判定に代えている.
  • if式全体にも型がつくため,条件式が真のときの式の型と,条件式が偽のときの式の型は同じでなければなりません.
  • 関数定義の読みやすさでは関数引数でのパターンマッチやガードのほうが良いが,一方でそれでは式の途中に現れることができないのでcaseやifもまた求められている.
  • 一時的な定義を行うには,where節やlet式を使う.「一時的」と言うのは他の関数や値の定義に影響を与えないという意味.
  • let式は式中で一時的な定義を行うことができる.
  • 式中ではなく,宣言全体で使える一時的な定義を行うにはwhere節を使う
  • 再帰的な考え方をするにはまず
    • 構造再帰で対象(= 引数)を構造的に分解していく
    • ベースケースを考える
    • 結果として守られる性質に注目する
  • 理想的にはデータの構造を気にせずに,全体に丸々変換をかけられるような関数だけを組み合わせて望む処理を書きたい
  • 「結果が関数になる関数」「引数として関数を要求する関数」をとくに高階関数と呼ぶ.