Neden monadlar ihtiyacımız var mı?
Benim düşünceme ünlü sorusunun cevabı "What is a monad?", özellikle de en iyileri seçildi, açıkça açıklamadan bir monad ne olduğunu anlatmaya çalışıyorumgerçekten neden gerekli olduğunu. Bir sorunun çözümü olarak açıklanabilir?
CEVAP
Neden monadlar ihtiyacımız var mı?
- Program istiyoruzsadece kullanma fonksiyonlar. ("fonksiyonel programlama (FP)").
O zaman, ilk olarak büyük bir sorunumuz var. Bu bir program var
f(x) = 2 * x
g(x,y) = x / y
Nasıl diyebilir miyizne ilk yürütülecek? Nasıl fonksiyonları (örn . sıralanmış bir dizi oluşturabilir miyiz ^strong>bir program)kullanarak fonksiyonları daha fazla?
Çözüm:oluşturma fonksiyonları. Eğer ilk isterseniz
g
f
,f(g(x,y))
yazın. Bu, "program" bir işlevi de vardır:main = f(g(x,y))
. TAMAM, ama ...Daha fazla sorun: bazı işlevlerbaşarısız olabilir(0 tarafından yani
g(2,0)
, bölme). Var"özel durumlar" . hayır FP (istisna bir işlev değil). Nasıl çözeriz bunu?Çözüm: hadifonksiyonları iki dönüş için işler biraz izin ver:
g : Real,Real -> Real
(gerçek bir iki gerçek işlevi) yerine,g : Real,Real -> Real | Nothing
((gerçek ya da hiçbir şey) iki gerçek işlevi) izin verin.Ama işlevleri (basit) sadece dönmelidirbir şey.
Çözüm: hadi iade edilmesi için yeni bir veri türü oluşturmak için bir "boks yazın" o belki de bir gerçek alır ya da sadece, bir şey yok. Dolayısıyla,
g : Real,Real -> Maybe Real
yapabiliriz. TAMAM, ama ...Şimdi 10 ** ne olacak?
f
Maybe Real
bir tüketmeye hazır değildir. Ve,g
Maybe Real
tüketmek bağlarız her fonksiyonu değiştirmek istemiyoruz.Çözüm: hadi"/""/"" fonksiyonları . bağlantı oluştur "bağlanmak için özel bir işlevi var . Bu şekilde, arka planda, bir işlevi çıkışını takip eden bir beslemek için adapte edebiliriz.
Bizim durumumuzda:
g >>= f
(Bağlan/oluşturf
g
). İstiyoruz>>=
g
'In çıkış teftiş ve, diye.Nothing
sakın aramaf
dönüşNothing
; ya da aksine, özü kutuluReal
yemf
ile. (Bu algoritma sadece 25 **Maybe
türü) uygulamasıdır. Ayrıca>>=
yazılı olması gerektiğini unutmayınsadece bir kez""(farklı kutusu farklı adapte algoritma). boks tipine görePek çok başka sorun, bu aynı modeli kullanarak çözülebilecek ortaya çıkar: 1. Bir "o dönüşü"
g
gibi farklı anlamları/değerleri, ve fonksiyonları/mağaza öngörülüyor "kutulu değerleri". kutusunu kullanın 2. Besteci/linkerg >>= f
g
'f
s çıkış giriş'sf
herhangi bir değişiklik hiç gerek yok. bağlama yardımÇözülebileceğini olağanüstü sorunları bu tekniği kullanarak
fonksiyonları sırayla her işlev, küresel bir devlet olması ("program") paylaşabilirsiniz: çözüm
StateMonad
.Sevmiyoruz "saf olmayan işlevleri": işlevleri verimfarklıçıkış içinaynıgiriş. Bu nedenle, bu işlevler, onları tagged/kutulu bir değer döndürmek için yapım, mark: 34* *monad.
Toplam mutluluk!
Tam olarak Maven bir Anlık nedir ve ne...
Neden C Sanal Yöntemler ihtiyacımız va...
#Pragma işaretlerinin önemi nedir? Ned...
Neden ve C boks kutulama ihtiyacımız v...
Neden varlık nesneleri ihtiyacımız var...