カリー化(Currying)とは、複数の引数をとる関数を、引数を一つずつとる関数に変換することである。
概要
関数 z = f(x, y) を例に説明すると、h = g(x), z = h(y) (g, hは関数)のようにx, y の2つの引数をとって z を出力する関数 f から、xを引数にとって「y を引数にとって z を出力する関数 h」を出力する関数 g を定義することをカリー化という。
上記で引数が2つの時を z = f(x, y) = h (y) = g(x)(y) のような表記法を許すなら、引数が3つなら、z = f(x, y, w) のとき、h = g(x), i = h(y), z = i(w) (g, h, i は関数)といった形を z = g(x)(y)(w)と書くことができる。
これを帰納的に適用すれば、
n項演算子 ⇒ n-1個の変数から生成された1項演算子
という変形をすることができる。
このgは関数を返り値とする関数、つまり高階関数になっている。Haskellではすべての関数が標準でカリー化されているため、重要な概念となっている。
例
足し算演算子"+"は2つの引数を取る中置記法の二項演算子である。一般的な表記は以下の通り。
1 + 2
この"+"を単なるアルファベットとみなせば、普通の二変数関数と同じように書くことができる。
(+) 1 2
ここでカリー化を"+"に適用し、第一変数の1を作用させる。
(+ 1) 2
2つの引数を足し算する二項演算子"+"が、カリー化により一つの引数に1を足す一項演算子"+1"にすることができた。
この書き方では分かりにくいが、以下ようになっている。
f(x, y) = x + y
↓ カリー化
gx(y) = x + y
これは自然数自体がある種の「演算子」の働きを持つことを示唆しているが、厳密な話を気にする必要はあまりないだろう。
名前の由来
プログラミング言語Haskellの名前の由来である数学者Haskell B. Curryに由来する(Haskellの開発者とは別人)。同一人物の姓と名が別々のものに使われるというのは珍しいといえる。
お気づきの通り、Curryの綴りはカレーのそれと完全に一致している。だからカレー化と書けないこともないが、なんだかよくわからないことになってしまうので、カリー化と表記される。
どんな食材を使ってもカレー粉を入れて煮込めばなんでもカレーという料理になってしまうみたいな話が数学的にも可能だ…と言うことかもしれない。
関連動画
関連項目
- 0
- 0pt