Currying
- Okunuşu
- köriing
Kısaca
Currying, birden çok argüman alan bir fonksiyonu, her biri tek argüman alan fonksiyonlardan oluşan bir zincire çevirir; argümanlar böylece birer birer verilir.
Currying nedir?
Currying, birkaç argüman alan bir fonksiyonu, her biri tek bir argüman alan bir dizi fonksiyon olarak yeniden yazar. Currying uygulanmış bir add, add(2, 3) yerine add(2)(3) şeklinde çağrılır: ilk çağrı 2 değerini alır ve bir sonraki sayıyı bekleyen yeni bir fonksiyon döndürür. Teknik, adını mantıkçı Haskell Curry'den alır; ancak Moses Schönfinkel aynı fikri 1924'te tarif etmişti.
Currying closure'lar sayesinde çalışır: döndürülen her fonksiyon o ana kadar verilen argümanları hatırlar, sonuncusu da asıl hesaplamayı yapar. Haskell, OCaml ve F#'ta her fonksiyon otomatik olarak curry'lenir; bu yüzden bir fonksiyonu beklediğinden daha az argümanla çağırmak, yalnızca geri kalanını bekleyen bir fonksiyon döndürür. JavaScript ya da Python'da bunu iç içe fonksiyonlarla elle yazarsınız ya da Lodash veya Ramda'daki curry gibi bir yardımcı kullanırsınız.
Currying, genel fonksiyonlardan özelleşmiş fonksiyonlar üretmeyi kolaylaştırır. Curry'lenmiş bir log(level)(message), her yerde yeniden kullanabileceğiniz bir log("warn") verir; [1, 2, 3].map(add(10)) da yeni bir fonksiyon yazmadan her elemana on ekler. Her ekranda bir seçim soran bir kahve makinesine benzer: boyutu seçtiğiniz anda ayarlanmıştır ve yalnızca içeceği bekler.
Currying sıklıkla kısmi uygulama (partial application) ile karıştırılır. Kısmi uygulama bir fonksiyonun bazı argümanlarını sabitler ve geri kalanını tek seferde alan bir fonksiyon döndürür; JavaScript'te add.bind(null, 5) ya da Python'da functools.partial bunu yapar. Currying ise her zaman tek argümanlı fonksiyonlardan oluşan bir zincir üretir ve bu da kısmi uygulamayı çok kolaylaştırır: curry'lenmiş bir fonksiyonu yalnızca ilk argümanıyla çağırmak zaten bir kısmi uygulamadır.
Önemli noktalar
- Currying,
f(a, b, c)biçiminif(a)(b)(c)biçimine dönüştürür. - Döndürülen her fonksiyon, önceki argümanları bir closure aracılığıyla hatırlar.
- Haskell, OCaml ve F# her fonksiyonu otomatik olarak curry'ler.
addfonksiyonundanaddTengibi özelleşmiş fonksiyonlar üretmeyi kolaylaştırır.- Kısmi uygulama bazı argümanları tek seferde sabitler; currying ise argümanları her zaman birer birer alır.
Örnek
// A regular function takes both arguments at once
const add = (a, b) => a + b;
// The curried version takes one argument and returns a function for the next
const curriedAdd = (a) => (b) => a + b;
curriedAdd(2)(3); // 5
const addTen = curriedAdd(10); // the first argument is now fixed
[1, 2, 3].map(addTen); // [11, 12, 13]
// Partial application without currying: fix the first argument with bind
const addFive = add.bind(null, 5);
addFive(1); // 6Sık sorulan sorular
Currying ile kısmi uygulama arasındaki fark nedir?
Currying bir fonksiyonu tek argümanlı fonksiyonlardan oluşan bir zincire dönüştürür. Kısmi uygulama ise bir fonksiyonu alır, bazı argümanlarını sabitler ve geri kalan argümanları alan bir fonksiyon döndürür. Currying kısmi uygulamayı kolaylaştırır, ama ikisi farklı dönüşümlerdir.
Neden currying deniyor?
Adını bu fikri yoğun biçimde kullanan Amerikalı mantıkçı Haskell Curry'den alır; Haskell programlama dilinin adı da ondan gelir. Fikri daha önce Moses Schönfinkel tarif ettiği için zaman zaman schönfinkeling olarak da anılır.
Currying JavaScript'te ne zaman işe yarar?
Çoğunlukla yüksek dereceli fonksiyonlarda ve bir fonksiyonun önce ayarlanıp sonra çağrılması gereken zincirlerde (pipeline) işe yarar; örneğin bir kimliğe ihtiyaç duyan bir olay işleyicisi ya da bir ayara ihtiyaç duyan bir map callback'i. Günlük kodda sade bir arrow function çoğu zaman daha anlaşılır okunur; bu yüzden currying'i kodu gerçekten kısalttığı yerlerde kullanın.
İlgili sayfalar
- Yüksek dereceli fonksiyonProgramlamanın Temelleri, s. 62Yüksek dereceli fonksiyon, başka bir fonksiyonu argüman olarak alan, fonksiyon döndüren ya da ikisini de yapan fonksiyondur; davranış veri gibi taşınabilir.
- ClosureProgramlamanın Temelleri, s. 7Closure, oluşturulduğu kapsamdaki değişkenleri hatırlayan bir fonksiyondur; dıştaki fonksiyon sona erdikten sonra bile bu değişkenleri kullanabilir.
- Fonksiyonel programlamaProgramlamanın Temelleri, s. 24Fonksiyonel programlama, paylaşılan verileri değiştirmeyen saf fonksiyonlarla yazılım kurma stilidir; kodu daha öngörülebilir ve test etmesi kolay yapar.
- FonksiyonProgramlamanın Temelleri, s. 23Fonksiyon, belirli bir işi yapan, isteğe bağlı olarak parametre denen girdiler alıp sonuç döndürebilen, adlandırılmış ve yeniden kullanılabilir kod bloğudur.
- HaskellProgramlama Dilleri, s. 14Haskell, tembel değerlendirme kullanan, saf fonksiyonel ve statik tipli bir dildir; anlatımı güçlü tip sistemi ve matematiksel kesinlikteki koduyla bilinir.
- Saf fonksiyonProgramlamanın Temelleri, s. 52Saf fonksiyon, aynı girdi için her zaman aynı çıktıyı döndüren ve yan etkisi olmayan, yani kendi dışındaki hiçbir şeyi değiştirmeyen fonksiyondur.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin