カリー化(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の綴りはカレーのそれと完全に一致している。だからカレー化と書けないこともないが、なんだかよくわからないことになってしまうので、カリー化と表記される。
どんな食材を使ってもカレー粉を入れて煮込めばなんでもカレーという料理になってしまうみたいな話が数学的にも可能だ…と言うことかもしれない。
掲示板
1 ななしのよっしん
2019/07/16(火) 16:52:06 ID: JShmN+5Mec
全然利点が分からない……。
偉い人たちが積極的に使ってるということはそれなりの利点が絶対にあるのだろうけど、僕には難しすぎますw
「カリー化しないと実現できない操作」とかってあるのかな?
2 ななしのよっしん
2020/03/10(火) 01:33:35 ID: BU3Rf1Ddvi
意味論とかを考えてる人には論理を見通し良く扱いやすいものにするために必須らしい
データベースの圏の双関手としてデータの直積を自然に構成するのに使うとかなんとかかんとか
データの変換とか格納の「効率の良さ」を感覚じゃなくアルゴリズム的に導くということらしい
ようするに道具としてプログラム使ってる人にはあんまり恩恵はないということですな
3 ななしのよっしん
2020/08/08(土) 21:21:42 ID: H7QFlwzpl/
単純に関数がカリー化されていると部分適用をすることができるからラムダ式を書く手間が省けるって言うのとポイントフリースタイルが使えるっていうのじゃね?(要するに高階関数が使いやすい)
急上昇ワード改
最終更新:2025/01/18(土) 14:00
最終更新:2025/01/18(土) 13:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。