BİLGİ SAYAMIYORUM beta

Scheme ve DrRacket dillerinde MAP, FILTER, FOLDR, FOLDL nasıl çalışır, lambda ile bu temel liste fonksiyonları nasıl uygulanır?

0

Eğer bu diller ile uğraştıysanız bildiğiniz üzere Lisp ten çok da farkları yok, daha doğrusu bu dillerden herhangi birini bilmek, çoğunlukla diğerini de kolayca uygulamanızı sağlamaktadır. Ayrıca bu 3 temel fonksiyonun nasıl çalıştığını bilmek başka dillerde de listeler üzerinde yapılan işlemler için fazlasıyla fikir yürütme kabiliyeti geliştirmenizi sağlıyor. Bu sebeple de zaten, bilgisayar bilimleri okurken bunlar önemli bir yer kaplıyordu.

Öncelikle, bu dillerde en temel fonksiyonlardan biri lambda olduğu için, ilk önce onun nasıl çalıştığına dair fikriniz olmalı, ilk işlem iki sayının toplamını yapan bir lambda fonksiyonu, bunun dahilinde sayıları da veriyoruz ve 3 dönüyor: 

     ((lambda (x y) (+ x y)) 1 2)

     :3

lambda fonksiyonunu temel olarak tek başına kullanmayacaksanız, başka fonksiyonların içinde getir götür işi yapan bir şey olacak sizin için, mesela "car" listenin ilk elemanını döndürür, bu sebeple tek fonksiyonlu lambdaya, ilk önce tek işin (car x) yapmak diyoruz ardından da listeyi veriyoruz ve 1 dönüyor:

     ((lambda x (car x)) 1 2 3)

     :1

Lambdanın her kullanımını bir anda anlamanız pek mümkün olmayabilir ama kullandıkça pekişeceğinden eminim, zira liste fonksiyonları bunun için en güzel adaylar. Temel olarak bu 3 fonksiyon bir listeyi etkileyip sonuç alabileceğiniz 3 farklı durumu içeriyor:

MAP: Bir işlemi, listenin tüm öğelerine tek tek uygulayıp, aynı uzunlukta sonuçları içeren yeni bir liste üretmek. Tabii ki bu işlemi koşullu da yapabilirsiniz, yani fonksiyonun içine bir kontrol koyup bu işlemi bazılarına uygula bazılarına uygulama da diyebilirsiniz. Ama sonuçta koşul ibaresi de bu fonksiyonun içinde olduğu için yine her öğeye bunu uygulamış oluyorsunuz. Aşağıdaki işlem 2, 4, 7 den oluşan bir listeyi alıp lambda ile her liste öğesini 2 ile topluyor ve sonuçlardan oluşan yeni listeyi döndürüyor:

     (map (lambda (x) (+ x 2)) '(2 4 7))

     :(4 6 9)

Yani diğer dillere göre düşünürseniz; sonu kendiliğinden belirli bir for each fonksiyonu gibi çalışıyor. Kısaca; bir f fonksiyonunu listenin her elemana uygulayıp onlardan yeni bir liste oluşturuyor gibi düşünebilirsiniz: (map f '(1 2 3)) <==> (list (f 1) (f 2) (f 3))

FILTER: Bir listeyi alıp filtrelemenize yarıyor, yani belirli bir koşul gösterip ona listenin elemanlarının uyup uymadığını kontrol edip ona göre uyanlardan yeni bir liste oluşturuyor. Aşağıda, lambda, bir elemanın 3 olup olmadığını kontrol ediyor ve bunu verdiğimiz listenin her elemanına uyguluyor. Sonra bu koşulu sağlayanlardan oluşturduğu listeyi döndürüyor:

     (filter (lambda (x) (equal? x 3)) '(2 3 4))

     :(3)

FOLDR: Bu temel olarak diğer ikisinden biraz farklı. Öncelikle listenin elemanlarını ayrı ayrı değerlendirse de çoğunlukla diğerleri gibi bir liste değil, belirli bir değer döndürüyor. Çünkü foldr, fold right tan türüyor; mesela verdiğiniz bir sayıyı listedeki sayıların yanına ekliyor/birleştiriyor/yığıyor (: seçtiğiniz fonksiyona göre:

     (foldr + 0 '(1 2 3))

     :6

Burada işlem toplamı işlemi olduğu için, aslında yukarıdaki işlem şu şekilde de gösterilebilir: 1 + 2 + 3 + 0 Toplama işlemi yer değiştirmeye müsait olduğu için FOLDL ile sol taraftan ekleme yapabilirsiniz, onun da tek sonucu bu işlemi şu şekilde yapmak olacaktır: 3 + 2 + 1 + 0. CONS fonksiyonu liste kurma fonksiyonudur, şu şekilde bir liste de oluşturabilirsiniz:

     (foldr cons '(4) '(1 2 3))

     :(1 2 3 4)

Bu işlemler fonksiyonel programlamanın temelleri olduğu için bu kadar ile bırakıyorum çünkü her biri fazlasıyla kullanışlı onlarca şekillde test edilebilir ama temelini öğrenip bunları kendiniz yapmanız daha faydalı olacaktır. Ancak ileride başka yazılar dahilinde daha karmaşık işlemler dahilinde bunlara değinebilirim. 

BENZER 7

Kimse etkileşime girmemiş

ETİKETLER