Körilemek (Currying)
Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde özellikle tembel çalıştırma (lazy evaluation) kullanılan programlamalarda fonksiyonların parametre sayılarını teke indirmek için kullanılan bir yöntemdir. Örneğin 2 parametre alan f(X , Y) -> Z fonksiyonu olsun. Bu fonksiyonda X ve Y parametre, Z ise sonuçtur. Körilendikten sonra bu fonksiyonun curry(f) : X -> (Y -> Z) olarak düşünülmesi mümkündür. Yani artık f fonksiyonu 1 adet X parametresi almakta ve sonuç olarak Y->Z şeklinde bir fonksiyon döndürmektedir.
Daha müşahhas bir örnek olarak bölme işlemini düşünebiliriz. Bölme işlemi f(X,Y) -> Z şeklinde düşünülürse f(X,Y) -> X/Y olan bir fonksiyondur. Bu fonksiyonu bölmeye göre tersini alma işlemi olan 1/X şekline dönüştürmek bir körileme işlemidir. Buna göre f(Y) -> Z olarak dönüşmekte ve f(Y) -> 1/Y olmakta yani X değeri sabitlenmektedir.
Benzer bir örnek ise toplama fonksiyonunun, arttırma fonksiyonuna dönüşmesinde yaşanır. Örneğin f(X,Y) -> Z şeklinde olan ve f(X,Y)-> X+Y olan toplama fonksiyonunda X=1 olarak sabitlenirse f(Y)-> 1+X olarak tek parametreli bir fonkisyona dönüşmüş olur.
Yukarıdaki örneklerde fonksiyonların parametre sayısı 1′e indirilmiş olan örnek fonksiyonları gördük bu fonksiyonların birlikte kullanılması da mümkündür. Örneğin f(X,Y,Z) = X / ( Y + Z) fonksiyonunu Z’nin 1 fazlasının tersi haline dönüştürmek istersek. f(Z)= 1+Z ve g(Z) = 1/Z şeklinde iki fonksiyon elde ederek bu fonksiyonların birleştirilmiş hali (compose) g(f(Z)) = 1/(1+Z) elde edilebilir.
Scheme dili ile körilemek
Körilemek işleminin rahatça kullanıldığı dillerde birisi de scheme dilidir. Aşağıdaki fonksiyonu ele alalım:
(define (f X Y) ( + X Y))
bu fonksiyon basit bir toplama fonksiyonudur ve 1 ile toplama olarak sabitlenince
(define (f Y) (+ 1 Y))
olarak yazılabilir.
Yazının başında da söylendiği üzere körileme işleminin en önemli özelliklerinden birisi tembel çalıştırma (lazy evaluation) ile kullanılmasıdır. bu durumda çalıştırma işlemini körileme fonksiyonu üzerinden yapabiliriz bunun için öncelikle curry fonksiyonumuzu tanımlayalım:
(define (curry fun . args)
(lambda x
(apply fun (append args x))))
Yukarıdaki kod 3 parametre almaktadır. fun ve args parametreleri doğrudan x parametresi ise dolaylı olarak alınmaktadır. En önemlisi ise daha önce de vurgulanan çalıştırma işlemini “apply” kendi içerisinde yapmasıdır. Dolayısıyla örneğin hevesli çalıştırmada (eager evaluation) apply fonksiyonu buna göre olacak tembel çalıştırmada (lazy evaluation) daha farklı olabilecektir.
(define arttir (curry + 1))
Şeklinde de 1 arttıran fonksiyonumuz tanımlanabilir. Kullanım için de
(arttir 5)
yazılması yeterlidir. Sonuç olarak 6 alınacaktır.
« Tembel Programlama (Lazy Programming) | Özyineli Fonksiyonlar (Recursive Functions) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Körilemek (Currying)' isimli yazı 05 Aug 2008 tarihinde, saat: 09:32 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 236 defa okunmuştur.
Benzer yazıları Programlama Dilleri kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Bağlantılar