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);   // 6

Dikkat edilecekler

  • fn.length default değerli ve rest parametreleri saymaz: (a, b = 2) => {} için length 1'dir.
  • this bağlamını korumak için apply(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)(); // 6

Kullanım alanı: kısmi uygulama (partial application) ile yeniden kullanılabilir fonksiyonlar, ör. const logError = log("error").

  1. var, let ve const arasındaki fark nedir?KolayJavaScriptFrontend
  2. == ile === arasındaki fark nedir?KolayJavaScriptFrontend
  3. Closure nedir? Bir örnekle açıklayın.OrtaJavaScriptFrontend
  4. Aşağıdaki kodun çıktısı nedir? (Event loop)OrtaJavaScriptFrontend
  5. this anahtar kelimesi nasıl belirlenir? Arrow function'larda ne değişir?OrtaJavaScriptFrontend
  6. Bir debounce fonksiyonu yazın.ZorJavaScriptFrontend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle