関数型プログラミングの特徴として関数のカリー化と部分適用が挙げられる
というよく見る文章の、たしかに間違っちゃいないんだがなんか違和感があるんだよな、という気分を比喩で表現
例文1: カリー化を説明する文章のサンプル
関数型プログラミング言語では、関数がカリー化されているのが特徴です
カリー化されない言語ではこのように明示的に部分適用を記述しなければいけませんが
JSの例
var f = function (a, b) { return a + b };
var f2 = function (a) { return function (b) { return f(a, b); } };
f2(1); //=> 引数に対して1を足す関数が返される
カリー化がベースとなっている関数型プログラミングに特化した言語では、非常にシンプルに記述することができます。
OCamlの例
let f a b = f + b
f 1 (* 引数に対して 1 を足す関数が返される *)
これがカリー化です!素晴らしいでしょう?
例文2: 同じような温度感でオブジェクト指向プログラミングを説明するサンプル
オブジェクト指向プログラミングの特徴として、参照ベースのオブジェクト記法が挙げられます。
参照がベースになっていない言語ではこのように矢印を使って参照を明記しなければいけませんが
C++の例
obj->method(a, b);
TurboPascalの例
obj^method(a, b);
参照がベースになっているオブジェクト指向に特化した言語では非常にシンプルに記述することができます。
Javaの例
obj.method(a, b)
これが参照ベースのオブジェクト記法です!素晴らしいでしょう!?
まとめ
OCamlやHaskellの関数定義がカリー化されているのは単に「そっちのほうがいろいろと便利だから」そうなっているというだけで、それ以上でもそれ以下でもない。
単にそうなっているので覚えておいてね、という程度のことなのに、なにか特別素晴らしいパラダイムシフトみたいに言われると違和感がある。1
-
例えば可変長引数の関数の定義が難しいなどの欠点もあってどっちが優れているか劣っているかという話でもない。 ↩