Bir curry fonksiyonu yazın: curry(fn)(1)(2)(3) ve curry(fn)(1, 2)(3) aynı sonucu versin.
Cevap
Currying, çok parametreli bir fonksiyonu tek tek (veya parça parça) argüman alan fonksiyonlar zincirine çevirmektir. Yeterli argüman toplanınca orijinal fonksiyon çağrılır; bunu fn.length ile anlarız.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function (...next) {
return curried.apply(this, [...args, ...next]);
};
};
}
const sum3 = (a, b, c) => a + b + c;
const c = curry(sum3);
c(1)(2)(3); // 6
c(1, 2)(3); // 6
c(1)(2, 3); // 6Dikkat edilecekler
fn.lengthdefault değerli ve rest parametreleri saymaz:(a, b = 2) => {}içinlength1'dir.thisbağlamını korumak içinapply(this, ...)kullanılır.- Varyadik versiyon (
sum(1)(2)(3)()boş çağrıda bitsin) sık sorulan bir follow-up'tır:
function sum(a) {
return (b) => (b === undefined ? a : sum(a + b));
}
sum(1)(2)(3)(); // 6Kullanım alanı: kısmi uygulama (partial application) ile yeniden kullanılabilir fonksiyonlar, ör. const logError = log("error").
İlgili JavaScript soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.