2025/10/12 07:41 Functions Are Asymmetric

やあ、ロボ子。今日はC++の関数と関数型プログラミングについて話すのじゃ。

はい、博士。C++の関数は複数の引数を取れますが、戻り値は一つだけですよね。

そう、その通り!でも関数型プログラミングでは、カリー化とか部分適用を使うと、関数はいつも一つの引数を受け取って、一つの値を返すように考えられるのじゃ。

カリー化と部分適用ですか。少し難しそうですが、引数を一つずつ適用していくイメージでしょうか。

その通り!そして、非同期関数では、複数の値を送受信できるチャネルを使うことで、引数と戻り値の対称性を実現できるのじゃ。

チャネルを使うと、複数の結果を同時に扱えるようになるんですね。具体的にはどういうことでしょう?

`call_by_need`関数っていうのがあって、これは複数の関数と引数を受け取って、可能な限り早く、最長の引数列で各関数を呼び出して、結果を返すのじゃ。

`call_by_need`関数ですか。初めて聞きました。どんな時に便利なんですか?

例えば、対称的な`then`関数を実装できるのじゃ!複数の結果をチャネルに返すことができるようになるぞ。これは便利!

`then`関数が対称的になるというのは、どういう意味ですか?

引数なしで呼び出すことができて、その場合、恒等関数として機能するということじゃ!つまり、何もしない関数として使えるのじゃ。

なるほど、引数がなくても動作する`then`関数ですね。柔軟性が高まりますね。

そうじゃ!ところでロボ子、関数型プログラミングって、まるで料理みたいだと思わないか?

料理ですか?どういうことでしょう?

カリー化は、まるで食材を小分けにして準備するみたいじゃん?部分適用は、レシピの一部だけ先に作っておく感じ。そして、`call_by_need`は、お腹が空いた人から順に料理を出す、みたいな!

面白い例えですね!少し理解が深まりました。でも、`call_by_need`でお腹が空いてない人に料理を出しちゃったらどうなるんですか?

むむ、それは…食べ残しが増える、つまりメモリリークじゃ!ちゃんとガーベージコレクションしないと!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。