Fonksiyonel Programlama Notları 3: Saf Fonksiyonel Promise Monad
03 Nov 2013
Sevgiler efendim. Uzun zamandır Fonksiyonel Programlamayı sökmeye çalışıyorum. Bu noktada karşıma yepyeni zorluklar ve zevkli işler çıkıyor. Nihayet Monad’ları biraz anlamayı başarabildim. Ve JavaScript’te daha önce yazdığım (monad olduğunu sonradan öğrendiğim) Promise Monadı’nı‘i tekrar yazayım istedim.
Daha önceden yazdığım Monad fonksiyonel programlamanın gerekliliklerini yerine getirmiyordu. Fakat bu implementasyonumda olabildiğince o düzeyde durmaya çalıştım. Umarım daha faydalı olmuştur.
Promise Monadı
Daha önce de dediğimiz gibi, fonksiyonel programlamada işleri olabildiğince küçük ve saf fonksiyonlar haline getirip bu fonksiyonları birbiriyle compose ederek yeni fonksiyonlar elde ediyorduk, ve eğer bu fonksiyonlar saf halini bozmadan, recursion vs. gibi yöntemlerle bir şekilde state taşıyorlarsa bu fonksiyonlara Monad diyorduk. Bu tanımda hata varsa lütfen düzeltin.
Şimdi Promise algoritmasının fonksiyonel olarak nasıl implemente edildiğine bakalım.
Kod üzerine açıklama satırı yazarak anlatmaya çalıştım;
When Monadı
Daha önceki yazımda when algoritmasını daha uzun yazmıştım; fakat fonksiyonel programlama ile daha hızlı bir sonuç elde edebiliyorsunuz.
When de aslında bir Promise. Yani implemente ederken promise kullanıyorsunuz.
When de bir monad. Yine state taşıma özelliğine sahip ve saf sayılabilir. (deferred.reject kısmı biraz yanetki gibi ama orası için daha farklı çözümler arıyorum.)
Şimdi testlerimizi yapalım:
.. ve çalıştıralım:
Önce yyi daha sonra xi resolve etmiş olsaydık yine aynı durum oluşacaktı. Eğer herhangi bir rejection işlemi yapsaydık;
Monad’lara hala çalışıyorum; eğer hata yaptıysam mutlaka düzeltmiş olurum :)
Yorumsuz Kod
Yorumlar kodu ilk bakışta görmeyi zorlaştırıyor gibi geldi; bu yüzden kodu bir de yorumsuz ekliyorum: