JavaScript'de currying

16 views
Skip to first unread message

myavuzselim

unread,
Aug 19, 2007, 1:16:28 PM8/19/07
to core-haskell
Merhaba,

Burasinin bir Haskell listesi olmasina ragmen fonksiyonel programlama
ile ilgili bazi seyleri buraya yazabiliriz sanirim. Eger konu disiysa
ozur diliyorum.

Dun aklima bir fikir geldi. JavaScript son derece dinamik bir dil,
acaba JavaScript fonksiyonlarini curried hale getirebilir miyim diye
dusundum. JavaScript'de closure'lar var, bu bana yardimci olabilirdi.
Biraz ugrastan sonra

function f(a,b,c) { ... }
var g = curry(f);
g(1)(3)('2);

gibi kullanilacak hele getirdim. Daha sonra biraz google'da bu konuyu
arastirirken http://www.svendtofte.com/code/curried_javascript/
sayfasini gordum. Orada g(1,2)()(3) gibi kullanimlara da izin
vermisler, ama f'in currying icin ozel bir sekilde yazilmasi
gerekiyor. Ben de biraz ugrasip benimkini de g(1,2)()(3)
seklinde kullanilabilecek bir duruma getirdim.

Kod yaklasik su sekilde calisiyor: curried fonksiyon, eger yeteri
kadar arguman gelmisse, gercek fonksiyonu bu argumanlarla cagirip
sonucunu donduruyor. Eger henuz yeteri kadar arguman gelmemisse,
argumanlarin devamini kabul edecek bir closure donduruyor.

function curry(f, needed_len) {
if (needed_len == undefined)
needed_len = f.length;

var curried = function() {
var curried_args = arguments;
if (curried_args.length >= needed_len) {
return f.apply(this, arguments);
}
else {
var curry_result_function = function() {
var args = [];
for(var i=0; i<curried_args.length; i++)
args[args.length] = curried_args[i];

for(var i=0; i<arguments.length; i++)
args[args.length] = arguments[i];

return f.apply(this, args);
};
return curry(curry_result_function, needed_len-
curried_args.length);
}
};
return curried;
}

Bu sayede herhangi bir fonksiyonu curried hale getirebiliyoruz:

var curried_add = curry(function (a, b, c) {
return a + b + c;
});

alert(curried_add(1)(2)(3));
alert(curried_add(1)()(2)()(3));
alert(curried_add(1,2,3));
alert(curried_add(1)(2,3));
alert(curried_add(1,2)(3));

Isin garibi curry fonksiyonunu yukaridaki sekilde yazdiktan sonra
biraz daha internette arastirirken http://www.coryhudson.com/blog/2007/03/10/javascript-currying-redux/
sayfasini gordum. Adamin implementasyonu benimkiyle neredeyse birebir
ayni. Gec kalmisim :)

Sizce boyle birsey bir ise yarar mi? Ne icin kullanilabilir? Tabi
gereksiz yere kullanilmasini tavsiye etmem, hafiza ve performans
bakimindan normal fonksiyonlara gore cok daha kotu. Bir de IE'nin
closure'larla alakali garbage collection sorunu oldugunu hatirliyorum.

Reply all
Reply to author
Forward
0 new messages