LoginSignup
2

More than 5 years have passed since last update.

関数型プログラミングの入門記事に出てくる「カリー化」の違和感

Last updated at Posted at 2016-09-20

関数型プログラミングの特徴として関数のカリー化と部分適用が挙げられる

というよく見る文章の、たしかに間違っちゃいないんだがなんか違和感があるんだよな、という気分を比喩で表現

例文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


  1. 例えば可変長引数の関数の定義が難しいなどの欠点もあってどっちが優れているか劣っているかという話でもない。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2