Ana içeriğe geç

Monad

Okunuşu
monad
Güncellendi 3 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/monad

Kısaca

Monad, her biri sarmalanmış bir değer döndüren adımları zincirleyen bir fonksiyonel programlama desenidir; aradaki işleri Optional gibi sarmalayıcı üstlenir.

Monad nedir?

Monadların zor olduğuna dair bir ün vardır, ama gündelik fikir basittir. Bazı değerler, işe bir durum katan bir sarmalayıcının içinde gelir: bir Optional boş olabilir, bir promise henüz hazır değildir, bir liste birçok değer tutar, bir sonuç hata olabilir. Monad, böyle bir sarmalayıcı tür ile iki işlemden oluşur: düz bir değeri sarmalayıcının içine koyan bir işlem ve genellikle flatMap, bind ya da then adını taşıyan, kendisi de sarmalanmış bir değer döndüren bir sonraki adımı zincire ekleyen bir işlem.

İşin asıl yapıldığı yer zincirleme işlemidir. Değeri sarmalayıcıdan çıkarır, bir sonraki adıma verir ve sonucu düzleştirir; böylece hiçbir zaman kutu içinde kutu elde etmezsiniz. Java'da findUser(id).flatMap(User::address), adımlardan biri boş döner dönmez geri kalanları atlar; böylece aradaki null kontrolleri ortadan kalkar. JavaScript promise'leri de benzer hissettirir: then, başka bir promise döndüren bir fonksiyonu kabul edip onu bekler ve en sondaki tek bir catch, herhangi bir adımdaki hatayı yakalar.

Her ürünün bir tepsi üzerinde ilerlediği bir montaj hattı düşünün: her istasyon ürünü tepsiden alır, üzerinde çalışır ve sonucu yine bir tepsiye koyar; hat da kusurlu bir tepsiyi kenara çekebilir, böylece sonraki istasyonlar onu atlar. Kesin konuşmak gerekirse tanım, matematiğin bir dalı olan kategori kuramından gelir; Eugenio Moggi ve Philip Wadler onu 1990'ların başında fonksiyonel programlamaya taşıdı. Haskell, fonksiyonlarını saf tutmak için monadları kullanır: girdi ve çıktı, sırayla zincirlenen IO değerleri olarak tarif edilir ve do gösterimi bu zincirlerin sıradan, adım adım yazılmış kod gibi okunmasını sağlar.

Gerçek bir monad ayrıca üç monad yasasına uymak zorundadır; bu yasalar sade bir dille, bir değeri sarmalamanın tek başına hiçbir şey eklemediğini ve adımları farklı gruplamanın sonucu değiştirmediğini söyler. Gündelik kullandığımız pek çok tür yalnızca monada benzer: bir JavaScript promise'i kendisine verilen her promise'i otomatik olarak düzleştirir, bu yüzden promise içinde promise var olamaz ve bu da bazı uç durumlarda yasaları bozar. Monadlar ayrıca yalnızca map gerektiren functor'larla karıştırılır: map kutunun içindeki değeri dönüştürür, monadın flatMap işlemi ise kendi kutularını döndüren adımları zincirler.

Önemli noktalar

  • Monad, bir sarmalayıcı tür ile sarmalanmış değer döndüren adımları zincirlemenin bir yolundan oluşur.
  • Çoğu zaman flatMap, bind ya da then olarak adlandırılan zincirleme işlemi değeri çıkarır, sonraki adımı uygular ve sonucu düzleştirir.
  • Sarmalayıcı, adımlar arasındaki bir durumu üstlenir: eksik değerler, hatalar, bekleme ya da birden çok sonuç.
  • Optional, Result, listeler ve promise'ler tanıdık monadlar ya da onların yakın akrabalarıdır.
  • Kesin anlamıyla terim kategori kuramından gelir ve üç yasanın sağlanmasını gerektirir.

Örnek

Sonuç bulamayabilecek sorguları Optional.flatMap ile zincirlemek (Java)java
// Each lookup may find nothing, so each one returns an Optional
Optional<String> city = findUser(42)        // Optional<User>
    .flatMap(user -> user.address())        // Optional<Address>
    .flatMap(address -> address.city());    // Optional<String>

// No null checks between steps: once one is empty, the rest are skipped
System.out.println(city.orElse("unknown"));

// map would nest the boxes; flatMap flattens them, the heart of a monad
Optional<Optional<Address>> nested = findUser(42).map(user -> user.address());

Sık sorulan sorular

JavaScript Promise bir monad mı?

Neredeyse. then, bir monadın zincirleme işlemine çok benzer çalışır; bu yüzden promise'ler sezgi kazanmak için iyi bir yoldur. Ancak bir promise, promise benzeri her değeri otomatik olarak açar; bu yüzden promise içinde promise asla var olamaz ve bu da bazı uç durumlarda monad yasalarını bozar. Promise'ler için monada benzer demek doğru olur.

İyi bir geliştirici olmak için monadları anlamam gerekir mi?

Hayır. Muhtemelen onları Optional, promise'ler ya da dizilerin flatMap metodu aracılığıyla zaten kullanıyorsunuz. Kavram Haskell'de, Scala'da ya da fonksiyonel desenler üzerine kurulu kütüphanelerde daha çok önem kazanır; orada tek bir ortak ad, aynı araçların birçok türle çalışmasını sağlar.

map ile flatMap arasındaki fark nedir?

map, düz bir değer döndüren bir fonksiyon uygular; bu yüzden sonuç tek bir kutuda kalır. flatMap ise kendi kutusunu döndüren bir fonksiyon uygular ve ardından iki kutuyu tek kutuya düzleştirir; monadın kattığı şey de bu düzleştirme adımıdır.

İlgili sayfalar

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar