13

私はcurryこの方法で関数を実装しました:

function curry (fn) {
    var slice = Array.prototype.slice,
        args = slice.apply(arguments, [1]);
    return function () {
        fn.apply(null, args.concat(slice.apply(arguments)));
    };
}

上記の関数を使用して次のことを行うと

function add (x, y) {
    return x + y;
}

var inc = curry(add, 1);
console.log(inc(10));

ログに記録しundefinedます。期待される出力は 11 ではありませんか? コードの何が問題になっていますか?

注:関数 logsconsole.log(x, y)内で使用します。戻る理由がわかりません。add1 10undefined

4

2 に答える 2

13

returnカレー関数にa がありません。

いえ

return function () {
    return fn.apply(null, args.concat(slice.apply(arguments)));
};

それはうまくいくようです:)

于 2010-12-09T04:11:22.210 に答える
12

これはカレー関数の例です:

function curry(func) {
    var initial_args = [].slice.apply(arguments, [1]);
    var func_args_length = func.length;

    function curried(args) {
        if (args.length >= func_args_length) {
            return func.apply(null, args);
        }

        return function () {
            return curried(args.concat([].slice.apply(arguments)));
        };
    }

    return curried(initial_args);
}

このカリー関数は、任意の関数のカリー化されたバージョンを作成します。新しい関数にパラメーターを部分的に適用できます。部分適用ごとに、残りのパラメーターを受け取る関数が返されます。元の関数のすべてのパラメーターが適用されると、値が返されます。

于 2012-12-26T19:58:22.617 に答える