O kafa karıştırıcı yapar bir şey gibi "popüler" işlevleri olduğunu bind
ve <*>
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 fmap
veya 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 Functor
ve Monoidal
Ve de bunların bir kombinasyonunu sunar .Unit
unit
Sadece içinde çalıştığınız bağlamla ilgili bu üç şeyi belirterek son derece genel fonksiyonlar yazabilirsiniz.
Monad
bunun ü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 pair
onları 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 Monad
devreye join
giriyor, 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 bind
sadece 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.