てくのろじーたのしー

Haskellぺろぺろ

「関数型」というジャンル

多くのプログラミング言語関数型プログラミング要素が取り込まれるようになって久しいです。

  • Java8でラムダ式が導入された時は大きな話題になりました。
  • C#では2.0でジェネリクスが使えるようになり、3.0ではラムダ式型推論(のようなもの)も使えるようになりました。
  • ClojureScalaでは基本的にイミュータブルな値を使うコーディングが推奨され、関数合成も使います。時には遅延評価も使います。
  • Rubyのブロックは実質、高階関数ですね。
  • Shemeでは末尾再帰最適化が言語仕様として要求されます。

一部、関数型と言うにはやや強引なものもありますがラムダ式ジェネリクス型推論、イミュータブル、関数合成、遅延評価、高階関数、末尾再帰最適化、モナドなど関数型プログラミングには多くの側面があります。

今回は「関数型とは何か」のような話はしません。関数型というある意味バズワードとなってしまった言葉への一つの考え方を話します。

突然ですが私はEDMやハードコアミュージックが好きです。techno-tanoCというハンドルネームもHARDCORE TANO*Cが元ネタです。ハードコアテクノと一口に言ってもその分類はたくさんあり、wikiには現在12種類の分類が載っていますがこれもハードコアテクノの分類の一部に過ぎません。MainStreamGabbaやBrostepなどのようにここ数年生まれたような音楽ジャンルもあります。ジャンルの移り変わりの速さや新しいジャンルの発生の多様性はIT業界と同じかそれ以上と思います。

そんな音楽の世界でジャンルとは何なのでしょうか?BPS(beat per second)や使う音の傾向で分類されることが多いですが、これから外れる曲も多いです。一番無難な分類法は作曲者による宣言でしょう。youtubeニコニコ動画に上げられる多くの曲にはタイトルにジャンルが書かれていることが多く、「この曲は作曲者がこのジャンルだと言っているからこのジャンルだ」と考えることです。もちろん聞く人によって「この曲はこのジャンルの方が適切ではないか」ということはあると思いますし、私も時々「この曲は自分の思うジャンルの傾向と違う」と思うことはありますがそれを批難する人は原理主義者ぐらいでしょう。

閑話休題、「関数型」というのもこれに似たものではないでしょうか? 先ほど挙げた特徴を以って言語を「関数型」と分類することは簡単です。しかし「関数型」には明確な定義がありません。従って個々人の思う「関数型」には差異があります。これは言語設計者にも言えることです。「関数型」言語あるいは「関数型」の機能を持った言語は言語設計者の思う「関数型」を体現したものです。

時々「その定義だと○○という言語は関数型ではなくなる」「その定義だと△△という言語まで関数型言語になってしまう」という言葉を見かけますが、それはその言語設計者が思う「関数型」との差異があったというだけで、言語設計者を絶対視した原理主義者の言葉に他なりません。

「関数型」という単語は一定のコンセンサスを以って用いるには便利ですが、定義がない以上乱用は混乱を招きます(言語設計者も例外ではありません)。誰かを絶対視した原理主義者にはなりたくないものです。