JS ILE FONKSIYONEL PROGRAMLAMA

Monad Nedir?

Fonksiyonel Programlanın önemli konularından Monad nedir konusunu işleyeceğiz. Adını duyduğumuz da anlam ifade etmeyen Monad örnek ile anlatırsak JS Promise bu yapıdadır dediğimde herkesin daha ilgisini çekebilecek bir konu.

--

Bu yazıyı daha önceden yazmış olduğum JS ile Fonksiyonel Programlama yazısının bir devamı olarak yazıyorum. Bir çok kavramı tek bir yazıda ele almanın yaratacağı karmaşıklıktan kaçmak için bu şekilde bir yönteme başvurdum.

Monad konusu internet üzerinde araştırdığınızda çok farklı konular ile karşılaşabilirsiniz.

  • Felsefe Leibniz’in Monad bir göz gezdirebilirsiniz.
  • Matematik Kategori Teorisi videolarına bakabilirsiniz.

Bizim konumuz yazılım olduğu için temeli matematikteki Kategori Teorisi bu işin temelini oluşturuyor. Ama biz yazılımcılar için baya karmaşık ve soyut. En iyisi mi gelin biz bu işe yazılım perspektifinden JavaScript ile bakalım.

Konu zaten karmaşık olduğu için en anlaşılır kısmından başlayalım. Monad nerelerde kullanıyoruz, nerede işimize yarıyor ?

A. Monad Ne İşimize Yarıyor ?

Monad yapmak istediğiniz işlemler ve hesaplamalar daki tuhaflık ve karmaşıklıklardan bizi soyutlayan katmandır. Bu sayede geliştirici bu işlemlerde esas odağını kaybetmemiş olur. Örneğin;

1. Promise/Future Monad

Sonucu işlem yaptığınız sırada henüz belli olmayan işlemlerin sonucunu tutan kap

Not: Bu konuda daha detaylı konuyu öğrenmek isterseniz önceden yazmış olduğum aşağıdaki seriyi okumanızı öneririm.

Promise.resolve($.getJSON('/path......'))
.then(function(data) {
// Do something here...
});

2. Maybe Monad

Yine bir fonksiyon sonucunda bir değer veya değer üretmediğinden emin olamadığımız durumlarda (undefined veya null) olmasından kaynaklı uygulamamızın crash (çökmemesini) sağlayacak kap

Maybe Monad (https://codewithstyle.info/advanced-functional-programming-in-typescript-maybe-monad/)

3. List Monad

Rastgele sayıda sonuç döndürebilen kesin olmayan hesaplamarı soyutlamak için kullanılan kap

4. I/O Monad

I/O Network işlemi yaparken sonucu kesin olmayan dönüşleri soyutlamak için kullanılan kap

Not: Burada diyebilirsiniz I/O Monad neden Promise Monad farklı. Aşağıdaki yazıları zaman bulup daha detaylı okuyunca bu konuyu tekrardan daha açarak anlatmaya çalışacağım.

5. Diğer Monad
Bunun gibi kullandığımız bir çok monad bulunuyor. Bunların listesini buradaki linkten erişebilirsiniz

B. Monad Nedir?

Monad fonksiyonları kapsamanın farklı bir yöntemidir. Bu yöntemde bir context ve işletim, dallanma ve I/O işlemleri Fonksiyonel Programlamanın Side Effect kısmına giriyor. Bu kısımda nasıl bir kap örüntüsü oluşturmalıyız ki bu SideEffect etkilerini azaltabilelim. Not: SideEffect için aşağıdaki yazıyı okumanızı öneririm.

JS kullanılan Monad Operasyonlarından bazılarını listelersek;

lift: Tipi normal değerden array dönüştürmek ilerde yapacağımız işlemlerde bir çok kolaylık ve Array High Order Function özelliklerini kullanma imkanı sunacaktır. Bu konuda daha detaylı bilgi için High Order Functions yazımı okuyabilirsiniz.

const x = 20;             // Some data of type `a`
const arr = Array.of(x); // The type lift.

flatten: Array yapısında hiyerarşik yapıları tek bir array içerisinde düzleştiren operasyonları içerir.

[[1], [2, 3], [4]].flat(); // [1, 2, 3, 4] or
[].concat.apply([], [[1], [2, 3], [4]]); // [1, 2, 3, 4]

map: Array içerisindeki her bir değeri bir işleme tabi tutup bunun sonucunu başka benzer bir yapı içerisinde oluşturur.

const arr=[1,2,3]
const f = n => n * 2; // A function from `a` to `b`
const result = arr.map(f); // [40]

context: Monadın hesaplama detayıdır. Functor / Monad API ve çalışmaları, monad ı uygulamanın geri kalanıyla oluşturmanıza olanak tanıyan bağlamı sağlar. Functors ve monad amacı, bu bağlamı soyutlamaktır, böylece bir şeyler oluştururken onun için endişelenmemize gerek kalmaz

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara(JS Fonskiyonel Programlama) erişmek için bu linke tıklayabilirsiniz.

Bu yazının devamı veya yazı grubundaki diğer yazılara(JS Async Programlama) erişmek için bu linke tıklayabilirsiniz.

--

--