部分適用とみなされて関数が返る。回カリー化するだけで複数回の部分適用が行え、十分な数の引数が与えられれば直ちに結果を返すような関数を返す――カリー化関数を作ってみようと思います。関数は、引数として関数を受け取り、その関数をカリー化した関数を返します。関数を受け取り関数を返すというのをコードにしてみます。};}返される関数の中では何を行えばいいのでしょうか。それはこの関数が呼び出されたときの引数の数によって異なってきます。十分な数の引数が与えられたなら、元の関数を呼び出し、その結果を返してやらなくてはいけません。プロパティから得ることができるので、これを利用してやります。};}これで「十分な数の引数が与えられたら直ちに結果を返す」ことは達成できました。引数の数が足りなかった場合は、部分適用がなされたものとみなして、関数を返すことにします。};}部分適用の結果として返ってくる関数とは何でしょうか。それは、足りない引数を受け取り、元々の関数を実行する関数です。これを実現するためには、部分適用された引数の値を覚えておく必要があります。オブジェクトを配列に変換するための決まり文句のようなものです。番目までの要素を抜き出したもの、すなわち元の配列全体のコピーを返します。オブジェクト全体をコピーした配列が返ってくるというわけです。回の部分適用しかできません。複数回の部分適用ができるようにするためには、部分適用の結果として返ってくる関数も、部分適用ができるようにする必要があります。部分適用ができるようにするためにはどうすればいいか、そう、カリー化です。回の部分適用ができるようになるカリー化関数はできているのですから、それを再度適用してやればよいのです。};}これで大丈夫かと思いきや、まだ問題があります。カリー化を行うためには、関数が必要とする引数の数がわかっていなくてはいけません。個の関数を使っているため、部分適用の結果として返される関数に対するカリー化がうまくいきません。関数式や関数宣言を使う以上、仮引数の数を動的に変えることはできません。プロパティが書き込み可能ならば問題はないのですが、あいにくこのプロパティは読み込み専用です。コンストラクタを利用することにします。受け取り、関数を返します。そのまま呼び出されます。これを使うことで、部分適用の結果として返る関数にも正常にカリー化を適用できるようになります。f.length);}これで完成です。それでは実際に試してみましょう。引数を使わない)うまくいきましたね。余分な引数を与えた場合、元々の関数にもその引数は渡されますが、この場合それは使われません。いうページが見つかりました。そこに載っている考え方に沿ってカリー化関数を書くと以下のようになります。iterate([]);}いきなり関数を返すのではなく、元々の関数を呼び出すか部分適用を行うかの処理を内部関数に切り出すことで、元々の関数を呼び出す部分が一箇所にまとまっています。関数を再度呼び出しているわけではないので、仮引数の数を調整する必要もありません。無引数の関数は部分適用をする意味がないので、その場合は渡された関数をそのまま返しています。[コメント(0)|トラックバック(0)]コメントコメントをどうぞ※メールアドレスとURLの入力は必須ではありません。入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。※投稿には管理者が設定した質問に答える必要があります。興味のある事柄についてつづる。関係技術とかマンガ・アニメとか。掲載コードのラインセンスポリシーとか、はてなブックマーカによるこのブログ上の注目の記事とか。