カリー化と部分適用について簡単に説明します。特定の言語に依存しない概念を説明するのが目的ですが、例としてJavaScriptとHaskellを使用します。
JavaScript
カリー化と部分適用はよく混同されるので注意が必要です。
- 関数を引数1つずつに分割してネストさせることをカリー化と呼びます。
- 一部の引数を固定化して新しい関数を作り出すことを部分適用と呼びます。
非カリー化 | カリー化 | |
---|---|---|
関数定義 |
|
|
使用例 |
|
|
部分適用 |
|
|
使用例 |
|
関数がカリー化されていれば、引数が足りないときに中間過程の関数が返って来ます。
> add1 = add(1)
[Function]
> add1.toString()
'function (y){return x+y;}'
add1
のx
の値は1
に固定化されているため、部分適用となります。
Haskell
Haskellの関数はデフォルトでカリー化されており、非カリー化はタプルで表現します。
非カリー化 | カリー化 | |
---|---|---|
関数定義 |
|
|
使用例 |
|
|
部分適用 |
|
|
使用例 |
|
add x y = x + y
は add = \x -> \y -> x + y
の糖衣構文です。
Q&A
Q. カリー化は何が嬉しいの?
A. 部分適用が簡単にできます。
Q. 部分適用なんて使うの?
A. コールバックの特殊化で便利ですが、JavaScriptではあまり使わないかもしれません。
Q. コールバックの特殊化とは?
A. 一部だけ異なるコールバックを大量に用意するのではなく、共通関数に対する部分適用で済ませるということです。
Q. あまり使わないのになぜJavaScriptで説明したの?
A. 馴染みのない言語の縁のない概念というわけではないからです。
※ 投げ槍な解答ですが、実例を通して慣れるしかないと思います。
参考
Haskellで説明を書きました。
- Haskell ラムダ 超入門 2014.11.27