Pratik bir bakış açısından, kombinatorler, mantık parçalarını ilginç ve sıklıkla gelişmiş şekillerde bir araya getirmenize izin veren bir tür programlama yapılarıdır. Genellikle bunları kullanmak, yürütülebilir kodu, genellikle (tarihsel nedenlerle) lambda işlevleri veya lambda ifadeleri adı verilen nesnelere paketleyebilme olasılığına bağlıdır, ancak kilometreniz değişebilir.
(Yararlı) bir birleştiricinin basit bir örneği, parametresiz iki lambda fonksiyonunu alan ve bunları sırayla çalıştıran yeni bir tane yaratır. Gerçek birleştirici şu şekilde genel sözde kodda görünüyor:
func in_sequence(first, second):
lambda ():
first()
second()
Bunu bir birleştirici yapan önemli şey, ikinci satırdaki adsız işlevdir (lambda işlevi); Aradığın zaman
a = in_sequence(f, g)
sonuçta ortaya çıkan nesne a, önce f () ve sonra g () işlemlerinin sonucu değildir , ancak daha sonra sırayla f () ve g () komutlarını çalıştırmak için çağırabileceğiniz bir nesnedir:
a() // a is a callable object, i.e. a function without parameters
Benzer şekilde, iki kod bloğunu paralel olarak çalıştıran bir birleştiriciye sahip olabilirsiniz:
func in_parallel(first, second):
lambda ():
t1 = start_thread(first)
t2 = start_thread(second)
wait(t1)
wait(t2)
Ve sonra tekrar,
a = in_parallel(f, g)
a()
İşin güzel yanı 'in_parallel' ve 'in_sequence', her ikisi de aynı tür / imzaya sahip birleştiricilerdir, yani ikisi de parametresiz iki işlev nesnesi alır ve yeni bir tane döndürür. Aslında daha sonra gibi şeyler yazabilirsiniz
a = in_sequence(in_parallel(f, g), in_parallel(h, i))
ve beklendiği gibi çalışır.
Temel olarak, birleştiriciler, programınızın kontrol akışını (diğer şeylerin yanı sıra) usule uygun ve esnek bir şekilde oluşturmanıza izin verir. Örneğin, programınızdaki paralelliğini çalıştırmak için in_parallel (..) birleştirici kullanırsanız, bununla ilgili hata ayıklama işlemini in_parallel birleştiricinin kendisinin uygulamasına ekleyebilirsiniz. Daha sonra, programınızın paralellikle ilgili bir hata içerdiğinden şüpheleniyorsanız, aslında sadece in_parallel biçimini yeniden uygulayabilirsiniz:
in_parallel(first, second):
in_sequence(first, second)
ve bir vuruşla, tüm paralel bölümler sıralı bölümlere dönüştürülmüştür!
Kombinatorler doğru kullanıldığında çok faydalıdır.
Bununla birlikte, Y birleştiricisi, gerçek hayatta gerekli değildir. Kendi kendine özyinelemeli işlevler oluşturmanıza olanak sağlayan bir birleştiricidir ve Y birleştirici olmadan bunları herhangi bir modern dilde kolayca oluşturabilirsiniz.