2016-12-07 15 views
0

私は、関数プログラミングやライブラリでは比較的新しいですが、ramda.jsなどのライブラリは非常に便利ですが、カリング機能の可能性があります。カレー化関数:それらを最適化する方法

const myFun = R.curry(
 
    (arg1, arg2) => { 
 
    let calculated = anotherFun(arg1) 
 
     //do something with calculated and arg2 
 
    return calculated * 5 + arg2 
 
    } 
 
) 
 

 
const anotherFun = (arg) => { 
 
    console.log("calling anotherFun"); 
 
    return arg + 1 
 
} 
 

 
var partial = myFun(1) 
 

 
console.log(partial(2)) 
 
console.log(partial(3))
<script src="//cdn.jsdelivr.net/ramda/0.22.1/ramda.min.js"></script>

として、私は非常に頻繁に物事を書くカリー化関数を使用しますが、明らかに、このような状況anotherFunに私はarg1にし、結果として場合でもpartialを呼び出すたびに呼ばれcalculated常に同じです。

この動作を最適化する方法はありますか?anotherFunはargsが変更されたときにのみ呼び出しますか?

私の心を横断する唯一の方法は、この

const myFun = R.curry(
 
    (calculated, arg2) => { 
 
    return calculated * 5 + arg2 
 
    } 
 
) 
 

 
const anotherFun = (arg) => { 
 
    console.log("calling anotherFun"); 
 
    return arg + 1 
 
} 
 

 
var calculated = anotherFun(1) 
 
var partial = myFun(calculated) 
 

 
console.log(partial(2)) 
 
console.log(partial(3))
<script src="//cdn.jsdelivr.net/ramda/0.22.1/ramda.min.js"></script>

であるが、このように私はMYFUNに渡される引数を変更する必要があり、これは外部のAPIを複雑

答えて

3

の場合あなたはこのように手動でカリングを行います

const myFun = arg1 => arg2 => { 
    let calculated = anotherFun(arg1) 
    // do something with calculated and arg2 
    return calculated * 5 + arg2 
}; 

あなたもこの最適化を行うことができます。

const myFun = arg1 => { 
    let calculated = anotherFun(arg1); 
    return arg2 => { 
    // do something with calculated and arg2 
    return calculated * 5 + arg2 
    }; 
}; 

私はRAMDAは何でここにあなたを助けるとは思いません。 JavaScriptコンパイラはこの種の最適化をしていません。

1

@Bergiこのラムダはあなたにこれに関する助けを提供しません。あなたはRAMDAスタイルの結果が必要な場合は、バック機能を得るために一つのパラメータで呼び出すことができ、またはその両方あなたがこれを行うことができ、結果を取得する場所:

const myFun = function(arg1, arg2) { 
    let calculated = anotherFun(arg1); 
    const newFunc = arg2 => { 
    return calculated * 5 + arg2 
    }; 
    return (arguments.length < 2) ? newFunc : newFunc(arg2); 
}; 

const with3 = myFun(3); 
//: calling anotherFun 

with3(1); //=> 21 
with3(2); //=> 22 
with3(4); //=> 23 


myFun(2, 7); 
//: calling anotherFun 
//=> 22 

myFun(2, 8); 
//: calling anotherFun 
//=> 23 

これは使用することができないのコストで来ますES2015矢印機能。しかし、それはあなたにとって価値があるかもしれません。

重要な場合は、両方のパラメータが指定されている場合は、内部関数を構築しないようにこれを少し修正することもできます。

0

ラムダのuseWithmemoizeについて教えてください。

const myFun = R.useWith(
    (a, b) => a * 5 + b, 
    [R.memoize(anotherFun), R.identity] 
); 
関連する問題