O kafa karıştırıcı yapar bir şey gibi "popüler" işlevleri olduğunu bindve <*>praxis yönlendirilmiştir. Ancak kavramları anlamak için önce diğer işlevlere bakmak daha kolaydır. Monad'ların öne çıktığı da dikkat çekicidir, çünkü diğer bağlantılı kavramlara kıyasla biraz fazladırlar. Bunun yerine functors ile başlayacağım.
Functors bir işlev sunar (Haskell gösteriminde) fmap :: (Functor f) => (a -> b) -> f a -> f b. Başka bir deyişle f, bir işlevi kaldırabileceğiniz bir bağlamınız vardır. Tahmin edebileceğiniz gibi, neredeyse her şey bir işlevdir. Listeler, Belki, Ya fonksiyonlar, I / O, tuples, ayrıştırıcılar ... Her biri bir değerin görülebileceği bir bağlamı temsil eder. Böylece, hemen hemen her bağlamda çalışan çok yönlü işlevleri fmapveya satır içi varyantını kullanarak yazabilirsiniz <$>.
Bağlamlarla başka ne yapmak istersiniz? İki bağlamı birleştirmek isteyebilirsiniz. Eğer bir genelleme almak isteyebilirsiniz Yani zip :: [a] -> [b] -> [(a,b)]böyle örneğin: pair :: (Monoidal f) => f a -> f b -> f (a,b).
Ancak pratikte daha da yararlı olduğu için Applicative, Haskell kütüphaneleri bunun yerine , ve aynı zamanda , aslında bağlamınızla "değerleri" koyabileceğinizi ekleyen Functorve MonoidalVe de bunların bir kombinasyonunu sunar .Unitunit
Sadece içinde çalıştığınız bağlamla ilgili bu üç şeyi belirterek son derece genel fonksiyonlar yazabilirsiniz.
Monadbunun üzerinde ifade edebileceğiniz başka bir şey. Daha önce bahsetmediğim şey, iki bağlamı birleştirmenin iki yoluna sahip olmanızdır: Sadece paironları değil , aynı zamanda onları da istifleyebilirsiniz, örneğin bir liste listeniz olabilir. G / Ç bağlamında bir örnek, bir dosyadan diğer G / Ç eylemlerini okuyabilen bir G / Ç eylemidir, böylece bir türünüz olur FilePath -> IO (IO a). Yürütülebilir bir işlev elde etmek için bu istiflemeden nasıl kurtulabiliriz IO a? İşte burada Monaddevreye joingiriyor, aynı türden iki yığın bağlamı birleştirmemize izin veriyor. Aynı şey ayrıştırıcılar, belki vb. İçin de geçerlidir ve bindsadece daha pratik bir yöntemdir.join
Bu yüzden monadik bir bağlam sadece dört şey sunmak zorundadır ve G / Ç, ayrıştırıcılar, arızalar vb. İçin geliştirilen neredeyse tüm makinelerle kullanılabilir.