Arantium Maestum

プログラミング、囲碁、読書の話題

「Haskellっぽさ」という「関数型プログラミング」のイメージ

関数型プログラミングが主流になりつつある」という話が(またしても)ツイッターで出ていた。LINQやらReactやらを引き合いに出した英語記事が議論の引き金のようだ。その話題の一部として「そもそも何をもって関数型プログラミングと呼んでいるのだ?」という議論もあった(ただしかなり局所的かつ小規模な議論だったが)。

いわゆる関数型プログラミング言語とされているものをいくつか挙げるとHaskellOCamlScala、Elm、Clojureなどがある。

これらの共通項としては「関数が値として扱える(その結果として高階関数のイディオムが豊富)」「イミュータブルなデータがデフォルト」の二点ではないだろうか?実際個人的には「イミュータブルなデータを豊富な高階関数で扱う」というのが「関数型プログラミング」の定義だと考えている。

ただ、これだけだと拍子抜けというかいわゆる「関数型プログラミング」の高尚さ、数学的な難しさというイメージからかけ離れている。そういったイメージは主にHaskellから来ているのでは?と考えている。

「高尚な関数型プログラミング」のイメージの源泉としてのHaskellっぽさはなんだろう?と考えると

  • 静的型付け
  • 代数的データ型とパターンマッチ
  • 型推論
  • 型クラスによるアドホック多相
  • 圏論ベースの抽象化(モナド、モノイドなど)
  • より高次元な型理論の概念(高カインド型など)
  • 遅延評価

あたりだろう。Scalaなどでも「関数型プログラミングなライブラリ」と銘打たれるものはこういった機能をサポートするものが多いように思える。

特にモナド関数型プログラミングのイメージと密接に繋がっている印象で、ただし例えばML言語族ではHaskellほどは重要な概念ではない(言語機能的にモナドを多用するのがHaskellほど自然ではない、というのも一因か?型クラスによるアドホック多相が大きい)。

私はOCamlClojureが好きなので、その視点からみると上記の特徴はあくまで「Haskellっぽさ」でしかない。しかしこれらが「イミュータブルなデータを豊富な高階関数で扱う」という最低限な関数型プログラミングを実用的にするための追加機能として積み上がっている、という側面はあると思う。OCamlClojureはまた違うものを積み上げているだけだ(OCamlならモジュール、Clojureは基本的なデータ構造を中心に言語が組み上げられているところなど)。

Haskellっぽさ」は「関数型プログラミング」の定義ではない。しかし「関数型プログラミング」を実用的にするために積み上げる機能群としては、非常に精緻な一つの解ではあるのだと思う。だからHaskellを学ぶことは当然関数型プログラミングの一つの側面を深く知ることになって勉強になる。ただし複数ある解のうちの一つである、という視点も忘れてはいけない。