カリー化:複数引数関数を単一引数関数の連鎖へ変換
カリー化は、複数の引数を取る関数を単一引数関数の列に書き換える変換である。ラムダ計算と関数型プログラミングの基礎であり、部分適用と合成を可能にする。
カリー化とは、複数の引数を取る関数を、それぞれが単一の引数を取る関数の連鎖へ変換することである。値の組 (x, y, z) を用いて関数 f を呼び出す代わりに、カリー化された形式では f(x)(y)(z) のように呼び出す。最初の呼び出しは x を受け取り、次に y を期待する関数を返す。この処理は最終結果が得られるまで続く。この変換は、入力から出力への対応を保ったまま、引数の渡し方を変更する。
形式的な考え方と簡単な例
形式的には、カリー化は f: A × B → C という形の関数と、f': A → (B → C) という形の関数との対応を与える。よく知られた算術の例として、二項加算関数を考える。f(x, y) = x + y であるとき、そのカリー化形式 f'(x)(y) に対して f'(2)(3) を適用すると、結果は 5 となる。f' に 2 を適用すると、入力に 2 を加える単項関数が生成される。これはしばしば部分適用と呼ばれる。
部分適用とカリー化の違い
部分適用とカリー化は関連しているが、同じものではない。カリー化は、多引数関数を入れ子になった単一引数関数へ変換する、表現の変更である。一方、部分適用は、関数の一つ以上の引数を固定し、より少ない引数を取る別の関数を生成する行為である。カリー化された関数では、中間段階の各値が新しい単項関数を返すため、部分適用を容易に行える。
理論的背景と歴史
この概念は、初期の形式論理学および関数適用の研究に根差している。組合せ論理や関連する形式体系における先駆的研究は、関数抽象に関する現代的な扱いに影響を与えた。「カリー化」という名称はハスケル・ブルックス・カリーを記念したものであり、モーゼス・シェーンフィンケルのような先行する研究者や、形式論理学の思想家たちも関連する考え方の発展に影響を与えた。カリー化は、関数とその適用を最小限の形式でモデル化するラムダ計算と密接に結び付いており、数学と計算機科学の双方で関心を集める主題である。
実装とプログラミング言語のサポート
一部の言語ではカリー化が慣用的に用いられるか、組み込みでサポートされている。たとえば、MLとHaskellなどの関数型言語では、関数を値として扱い、カリー化形式を一般的に使用する。ほかの現代的な言語やライブラリにも、関数をカリー化したり部分適用を行ったりするためのユーティリティが用意されている。詳細については一部の言語の文書を参照されたい。単項関数を強制しない言語であっても、プログラマーはクロージャや高階関数を通じてカリー化を実装し、同様のモジュール性を実現することが多い。
用途と利点
- モジュール性:計算をより小さな単項の段階に分解することで、振る舞いを分離し、構成要素を再利用しやすくなる。
- 合成:カリー化関数は、関数型プログラミングで一般的なポイントフリー形式や組合せ子的な形式において、より自然に合成できる。
- 部分的な特化:先行する引数を固定することで、コードを重複させずに特化した関数を得られる。
- 高階ユーティリティとの連携:map、fold、その他のコンビネータは、カリー化された関数を都合よく受け取れることが多い。
制約と区別
カリー化は、多数の値を含む単一のタプルやオブジェクトを渡すこととは異なる。呼び出し規約と合成の規則が異なるためである。環境によっては、過度なカリー化がわずかな性能上のオーバーヘッドを生じさせたり、この形式に不慣れな開発者にとって可読性を下げたりすることがある。APIを文書化または設計する際には、カリー化された関数とタプルを取る関数のどちらが想定する呼び出し側に適しているかを検討する必要がある。
参考文献
関数という一般概念と形式体系におけるその役割に関する概念的背景については、数理論理学および関数型プログラミングの入門書を参照されたい。歴史的な扱いでは、より広い形式論理学の文脈において、モーゼス・シェーンフィンケルとゴットロープ・フレーゲのような寄与者に言及される。具体的な言語例やチュートリアルについては、公式ページや教育リソースからリンクされる言語文書およびコミュニティガイドを参照するとよい。個別の案内は、一般的な数学および計算機科学のリソースにある言語マニュアルやオンライン資料から利用できる。
質問と回答
Q: カレーとは何ですか?
A: カリーとは数学やコンピュータ・サイエンスで使われるテクニックで、複数の引数を取る関数を、それぞれ1つの引数を取るいくつかの関数に変えることです。
Q: カレージングの基礎を作ったのは誰ですか?
A: 数学者のMoses SchönfinkelとGottlob Fregeがカリー技法の基礎を築きました。
Q: ハスケル・ブルックス・カリーとは誰ですか?
A: ハスケル・ブルックス・カリーは、カリー法の名前の由来となった数学者です。
Q: ラムダ微積分とは何ですか?
A: ラムダ計算とは、数理論理学とコンピュータ・サイエンスにおける、計算を表現するための形式的な体系です。
Q: ラムダ計算におけるcurryingの役割は何ですか?
A: ラムダ計算では、複数の引数を持つ関数を、1つの引数のみを持つ一連の関数に変換するためにカリー(currying)が使用されます。
Q: 関数の引数を1つに制限しているプログラミング言語はありますか?
A: はい、MLやHaskellのようなプログラミング言語には、関数は引数を1つしか持てないという制限があります。
Q: なぜMLやHaskellのようなプログラミング言語は、関数が取れる引数の数を制限しているのですか?
A: この制限は、カリー(currying)に由来するシンプルさと柔軟性が動機となっています。引数が1つしかない関数を持つことで、関数の合成や結合が容易になり、より簡潔で再利用可能なコードになります。
関連項目
著者
AlegsaOnline.com カリー化:複数引数関数を単一引数関数の連鎖へ変換 Leandro Alegsa
URL: https://ja.alegsaonline.com/art/24730
出典
- doi.org : 10.1023/A:1010000313106
- doi.org : 10.1023/A:1010027404223