9 puan yazan bboydart91 2026-02-08 | 2 yorum | WhatsApp'ta paylaş

Metin

  • Functor'un yalnızca map ile çözemediği iki problemden (kapsayıcının içindeki fonksiyonun içeride hapsolması sorunu, bileşim sırasında bağlamın iç içe geçmesi sorunu) yola çıkıp applicative functor ve monad'a kadar uzanan süreci TypeScript koduyla açıklıyor
  • 1988'de Eugenio Moggi'nin programları A → B yerine A → T(B) olarak modellemesinin arka planıyla başlıyor
  • flatMap = map + join yapısını ve bunun güvenli kullanımı için üç yasayı (birleşme, sol birim, sağ birim) ele alıyor
  • Monad'ın neden "endofunctor kategorisindeki monoid nesnesi" olduğunu, tamsayı toplamasındaki monoid ile karşılaştırarak açıklıyor
  • Promise'in monadik şekilde çalışsa da neden katı matematiksel anlamda bir monad olmadığından da bahsediyor

Functor'un sınırları: map ile yapılamayanlar

  • Curry'lenmiş bir fonksiyon map ile uygulanırsa sonuç Maybe<(b: number) => number> gibi olur ve fonksiyon kapsayıcının içinde hapsolur
    • map yalnızca kapsayıcının dışındaki fonksiyonları alabildiği için, içeride hapsolan fonksiyonu başka bir değere uygulamanın yolu yoktur
  • Functor döndüren iki fonksiyon bileştirilirse Maybe<Maybe> gibi bağlam iç içe geçer
    • Adımlar arttıkça Maybe<Maybe<Maybe<...>>> şeklinde sonsuz iç içelik oluşur

Applicative functor: kapsayıcının içindeki fonksiyonu uygulamak

  • apply işlemiyle kapsayıcının içinde hapsolmuş bir fonksiyon, başka bir kapsayıcıdaki değere uygulanabilir
    • apply: T<(A → B)> → T<A> → T<B>
  • pure işlemiyle saf bir değer kapsayıcıya yerleştirilir
  • Sınır: hangi kapsayıcıların bileştirileceğinin önceden belirlenmiş olması gerekir
    • Önceki hesaplamanın sonucuna bakıp sonraki hesabı belirleyen dinamik sıralı bağımlılık ifade edilemez

Monad: iç içeliği açan işlemin icadı

  • join işlemi T<T<A>> → T<A> ile çift kapsayıcıyı tek katmana indirger
    • JavaScript'teki Array.prototype.flat aynı görevi görür
  • Pratikte map + join birleşimi olan flatMap kullanılır
    • flatMap: T<A> → (A → T<B>) → T<B>
    • map A → B alırken flatMap A → T<B> alır ve sonucu tek katmanda tutar

flatMap'in üç yasası

  • Birleşme yasası: üçlü iç içe yapı T(T(T(A))) açılırken içten dışa da açılsa
    dıştan içe de açılsa sonucun aynı olması gerekir
    • m.flatMap(f).flatMap(g) === m.flatMap(x => f(x).flatMap(g))
  • Sol birim yasası: pure ile koyup hemen flatMap uygulanırsa, bu doğrudan fonksiyonu uygulamakla aynıdır
    • pure(a).flatMap(f) === f(a)
  • Sağ birim yasası: flatMap'e pure verilirse orijinal kapsayıcı aynen korunur
    • m.flatMap(pure) === m

"Endofunctor kategorisindeki monoid nesnesi" ifadesinin açılımı

  • Programlamadaki functor, tipler dünyasından tipler dünyasına gittiği için bir endofunctor'dur
  • Endofunctor'lerin kendilerini nesne olarak alan bir endofunctor kategorisi kurulabilir
  • Bunu monoid'in gerekliliklerine (ikili işlem + birleşme yasası + etkisiz eleman) uygularsak:
    • ikili işlem = join
    • etkisiz eleman = pure
    • yapı, tamsayı toplamasındaki monoid ile birebir örtüşür

Promise neden monad değildir

  • then, dönüş değerine göre map ve flatMap işlemlerini karıştırarak işler
  • Promise<Promise> durumu çalışma zamanında korunmaz, hemen tek katmana indirilir
  • Pratikte kullanışlı olsa da matematiksel monad yasalarını sağlamaz

2 yorum

 
calofmijuck 2026-02-08

Comonad'a da değinir misiniz?

 
bboydart91 2026-02-09

Ah... düşüneceğim hahaha