TL;DR
- Haskell、Scala、Clojure、Elixir を、関数、データ、評価戦略、ポリモーフィズムの観点で比べる発表。
- 関数型プログラマは適切な制約が解放をもたらすと考え、単純で安定した部品から全体を組み立てようとする。
内容
関数型プログラミングと関数型言語
関数型プログラミング(FP)は、純粋関数を基本要素とし、その組み合わせでプログラムを作るスタイルであり、言語を問わず実践できる。関数型言語(FPL)は、FP が言語や標準ライブラリのレベルで十分に支援され、FP のスタイルが当たり前になっている言語である。
関数
部分式を関数として取り出し(部分適用)、関数を組み合わせて(関数合成)式を組み立てる。
データ
FPL ではイミュータブルなデータを関数を通して変換する。データ型を定義し、構築し、分解することもできる。
評価戦略
純粋関数とイミュータブルなデータを前提にすると、評価の順序やタイミングの自由度が高まるので、遅延評価やメモ化ができるようになる。FPL に限った話ではないが、マクロでも評価を制御できる。
ポリモーフィズム
オブジェクト指向プログラミングでは、ポリモーフィズムというと継承による仕組み(サブタイプ多相の一例)が思い浮かぶ。一方で FPL ではアドホック多相やパラメータ多相など、別の仕組みが提供されていることが多い。例えば型クラス、マルチメソッド、型パラメータである。
関数型プログラマのメンタルモデル
関数型プログラマのメンタルモデルでは、適切な制約は解放をもたらす。
- 引数から戻り値を返す以外のことをする関数は信頼できないので、純粋関数にする
- 破壊的に変更されるデータ構造は怖いので、イミュータブルなデータや永続データ構造を使う
- 取りうる値が分からないのは不安なので、不正な値を表現できないようにし、より型安全にする
そのうえで、単純で安定した部品をもとに全体を組み立てたいので、式指向、宣言的、合成可能な書き方を好む。