関数型言語の考え方

以下は私のHaskellなどの関数型言語に対する理解。先日リンクしたHaskellのPPTを見てイメージできた。私は関数型に関して素人なので間違いを含むかも。

  • for, whileなどのループの制御文は、内部イテレータな「高階関数」は内部に再帰を含んでいると思われるので、突き詰めていくと「再帰」と「リスト内包表記」の2通りしかないと思われる。分類した方が分かり易ければ「高階関数」、「再帰」、「リスト内包表記」の3パータンに分類できる(他にあるのかな?)
  • 関数型言語の最大の特徴は、リストが特別なデータ構造になっているところだと思う。つまり、リストは「先頭要素」と「残りのリスト」のペアのポインタを持ち、「残りのリスト」はさらに「先頭要素」と「さらに残りのリスト」のペアのポインタを持つという再帰的な構造になっている
  • そして、そういう構造なので(あえてそういう構造にしているので)再帰処理がしやすい、無限リストが扱いやすいという特徴を持つ
  • そして、無限リストを扱うと無限に評価してしまわないように遅延評価が必要になる
  • そして、遅延評価をすると評価順が直観(正格評価の方が経験上直観に近い?)と異なるので、評価順が違えば状態を評価する順番により結果値が異なるので、状態を変更できないという参照透明性?が必要になる
  • そして、IOなど副作用を持った処理や呼び出した順(正格評価順?)に処理を行いたい場合として、例外的にモナドという考え方を導入する


他の項目は少しずつ勉強するつもり。それにしてもSchemeとかHaskellとか関数型言語は構文が直観的でないとか見やすくないものが多くすぐ忘れてしまう…。