TL;DR

  • Haskell、Scala、Clojure、Elixir を、関数、データ、評価戦略、ポリモーフィズムの観点で比べる発表。
  • 関数型プログラマは適切な制約が解放をもたらすと考え、単純で安定した部品から全体を組み立てようとする。

内容

関数型プログラミングと関数型言語

関数型プログラミング(FP)は、純粋関数を基本要素とし、その組み合わせでプログラムを作るスタイルであり、言語を問わず実践できる。関数型言語(FPL)は、FP が言語や標準ライブラリのレベルで十分に支援され、FP のスタイルが当たり前になっている言語である。

関数

部分式を関数として取り出し(部分適用)、関数を組み合わせて(関数合成)式を組み立てる。

データ

FPL ではイミュータブルなデータを関数を通して変換する。データ型を定義し、構築し、分解することもできる。

評価戦略

純粋関数とイミュータブルなデータを前提にすると、評価の順序やタイミングの自由度が高まるので、遅延評価やメモ化ができるようになる。FPL に限った話ではないが、マクロでも評価を制御できる。

ポリモーフィズム

オブジェクト指向プログラミングでは、ポリモーフィズムというと継承による仕組み(サブタイプ多相の一例)が思い浮かぶ。一方で FPL ではアドホック多相やパラメータ多相など、別の仕組みが提供されていることが多い。例えば型クラス、マルチメソッド、型パラメータである。

関数型プログラマのメンタルモデル

関数型プログラマのメンタルモデルでは、適切な制約は解放をもたらす。

  • 引数から戻り値を返す以外のことをする関数は信頼できないので、純粋関数にする
  • 破壊的に変更されるデータ構造は怖いので、イミュータブルなデータや永続データ構造を使う
  • 取りうる値が分からないのは不安なので、不正な値を表現できないようにし、より型安全にする

そのうえで、単純で安定した部品をもとに全体を組み立てたいので、式指向、宣言的、合成可能な書き方を好む。

キーワード

関連