kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

部分適用をカリー化と呼ばないで

カリー化と部分適用の違いについては、過去のエントリ カリー化 != 部分適用 で既に述べており、決着もついているので改めて書きません。

カリー化 != 部分適用のエントリを書いたのは2009年12月です。もう3年以上前の話になります。ですが、JavaScript界隈などをみると、未だにカリー化と部分適用の違いについての誤解は残っているようです。一方で、静的型付き言語界隈でそのような誤解をほとんどみかけません。カリー化が関数の「型」を変換する操作(関数)であるために、動的型付き言語にのみ慣れ親しんでいると、両者の違いがわかりにくいのかもしれません。

ある技術用語が指すものを誤解する事自体は仕方ないことですし、責めるものではありません。また、用語が指すものは時代を経ると変わっていくものだという主張もあるでしょう。ただ、カリー化という用語の定義は明確に定義されており、数十年もの歴史があります。ここ10年くらいのいわゆるLightweight Languageの台頭によって、本来の意味で「カリー化」という用語が使いにくくなるのは嬉しくありません。

というわけで、今回のエントリのタイトルにつながります。好き好んで間違った用語の使い方をする人は居ないと思いますが、

最初に、カリー化に関する誤解をした状態で、カリー化に関する記事を書く ->
別の人が最初のエントリをみて、誤解した理解でカリー化に関する記事を書く -> 
さらにそのエントリを読んだ人が…

のような状態になるのは珍しいことではありません。

一方、カリー化(を行う関数)と部分適用(を行う関数)では静的な型が異なるため、静的型付き言語ではこのような勘違いは起きづらいです。カリー化という用語の正しい使い方について調べるときは、動的型付き言語のサンプルコードを用いた解説ではなく、できる限り静的型付き言語(Haskell, OCaml, Standard ML)を用いた解説を読む事をお勧めします。

もちろん、動的型付き言語のサンプルコードで正しい「カリー化」の解説をしている記事も多数あるのですが、間違った記事や、ある言語の標準ライブラリが間違った「カリー化」関数を提供していることすらあるので(!)、カリー化について調べているときにどちらが正しいか判断するのはやや難しいです。