我對函數式編程和庫如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
叫我每次打電話partial
即使arg1
並因此calculated
時間總是一樣的。
有沒有一種方法可以優化這種行爲,並且只有在其參數改變時才調用anotherFun
?
跨越我的腦海裏唯一的辦法是這樣的
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複雜