• a tipi için tanımlanan,
    bir adet birleşme özelliği taşıyan işlem, op(a1, a2) = a3
    bir adet etkisiz eleman, a0
    şeklinde tanımlanan bir yapıdır.

    örneğin string concatenation,
    işlem:
    concat("s1", "s2") = "s1s2"

    birleşme özelliği:
    concat("s1", concat("s2", "s3")) = concat(concat("s1", "s2"), "s3")

    etkisiz eleman:
    zero = ""
    concat("s1", zero) = "s1"
  • monoid, fonksiyonel programlamada toplama ve çarpma gibi değişme özelliğine sahip işlemleri standardize etmemizi sağlayan yapılardır.

    mesela şu işlemi düşünelim:
    1 + 1 + 3 + 2

    rakamların yerini istediğimiz gibi değiştirelim, yine aynı sonucu elde ederiz.
    3 + 1 + 1 + 2

    çarpma da toplama gibi, rakamların yeri değişse de tamamen aynı sonucu verir.

    1 * 1 * 3 * 2
    3 * 1 * 1 * 2

    ancak çıkartma ve bölmede aynı durum geçerli değildir. bu yüzden çıkartma, bölme ve bunların mantığındaki işlemler monoid olamaz.

    programlama sadece matematikten ibaret değildir bildiğiniz gibi. mesela metinleri birleştirme işlemi de bir monoid sayılabilir.

    "bu" + "bir" + "elmadır"

    türkçe ne hoş bir dil ki, kelimelerin yerlerini değiştirsek bile anlamını korumaya devam ediyor. ancak "bu bir elmadır" ile "bir elmadır bu", harflerin konumu ve cümlenin yapısı gereği eşit değildir. fakat, kelimeleri arka arkaya kuralda bir değişim olmaksızın (örneğin, çıkartmada ve bölmede ilk başta ne geldiğine göre bütün işlem değişir) arka arkaya ekleyebiliriz.

    ancak monoid başlangıç için bir veriyi gerektirir. bu sayılar için sıfırdır, metinler için ardışık iki tırnak işaretiyle sembolize edilen boş metindir. eğer ardışık olarak toplanan veriler için başlangıç verisi sağlanamıyorsa bu işlem monoid değil, "semigroup"tur.

    scala'da çeşitli kütüphanelerin sağladığı |+| operatörü, haskell'de "<>" operatörü, ardışık işlemleri ilişkili tipe göre inşa eder. bu operatörler "semigroup" operatörü olarak bilinir. haskell'de semigroup

    örneğin:

    1 |+| 1 == 2
    "ekşi" |+| "sözlük" == "ekşisözlük"

    fonksiyonel programlamada tipler büyük rol oynar ancak tiplerin metin, sayı veya falanca classtan olmasından ziyade tipin ne tarz özelliklere sahip olduğu önemlidir. semigroup operatörü burada iyi bir örnek oluşturur. tipin ne olduğunun netçe bilmeye gerek bırakmadan, sadece bir ardışık işlem yapılabilmesi özelliği üzerine çalışır.

    monoidler, fonksiyonel programlamanın neredeyse yapı taşıdır ve buradan sonra işler çılgınlaşmaya başlar. fonksiyonel programlamanın "kim anlayacak bunları ya?" diye şikayet edilen monadlar gibi konuları aslında birer monoiddir. eğer sonuç etkilenmeksizin obje üreten fonksiyonların birleştirilmesi söz konusu ise bu bir monad'dır deriz. monoidleri anlamadan monadları anlamaya çalışmak, akarsu ne bilmeden vadileri anlamaya çalışmaya benzer.

    şimdi monadlara geçelim:
    (bkz: #150731491)
  • monoidler matematikte bir yapıdır,
    elemanları birleştirip yineleyen işlemle işin içinde kalırlar,
    birleştirme işlemi asosyaldir, sıralama önemlidir,
    ama monadlar onların üstünde yükselir.

    monadlar bir tür programlama yapısıdır,
    bir işlemi birçok adımda yapmak için kullanılır,
    soyutlamaya olanak sağlar, hataları en aza indirir,
    ama monoidleri anlamadan anlaşılmaz bu güzel yapılar.

    monadlar monoidlerin üstünde yükselir,
    onları anlamadan eksik kalırız,
    matematik ve programlama bir bütündür,
    birini anlamadan diğeri tam olmaz.

    monoidleri öğrenmek önemli,
    matematiksel bir yapıya sahip olduğu için de güzel,
    ama monadlar onların uygulama alanıdır,
    ikisini birleştirdiğimizde daha güzel bir dünya kurarız.
hesabın var mı? giriş yap