Applicatives oluÅŸtur, monadlar don't
Applicatives oluÅŸtur, monadlar yok.
Yukarıdaki ifade ne anlama geliyor? Ve ne zaman başka bir tercih mi?
CEVAP
Bu tür karşılaştırırsak
(<*>) :: Applicative a => a (s -> t) -> a s -> a t
(>>=) :: Monad m => m s -> (s -> m t) -> m t
iki kavramı ayıran bir ipucu elde ederiz. (>>=) yazın (s -> m t) s değer m t bir hesaplama davranışları belirleyen gösterir. Monadlar değer ve hesaplama katmanlar arasında girişime izin ver. (<*>) operatör böyle bir girişime izin verir: hesaplamaları değerlere bağlı değil işlevi argüman. Bu gerçekten saçma. Karşılaştırın
miffy :: Monad m => m Bool -> m x -> m x -> m x
miffy mb mt mf = do
b <- mb
if b then mt else mf
bazı etkisi sonucu ikisi arasında karar vermek için kullanırhesaplamaları(örneğin füze fırlatma mütareke imzalama), oysa
iffy :: Applicative a => a Bool -> a x -> a x -> a x
iffy ab at af = pure cond <*> ab <*> at <*> af where
cond b t f = if b then t else f
ab değeri arasında seçim yapmak için kullanırdeğerleriiki hesaplamaları at af, hem trajik etkisi belki de gerçekleştirdi sahip.
Monadic sürümü aslında (>>=) ekstra güç değeri hesaplama seçmek için kullanır, ve o kadar da önemli olamaz. Ancak, bu gücü destekleyen beste yapmak zor monadlar yapar. Eğer inşa & " için çalışırsak;-bind çift&üzerinizde
(>>>>==) :: (Monad m, Monad n) => m (n s) -> (s -> m (n t)) -> m (n t)
mns >>>>== f = mns >>-{-m-} \ ns -> let nmnt = ns >>= (return . f) in ???
buraya kadar geldik, fakat şimdi bizim katmanları karmakarışık. Dış kurtulmak için ihtiyacımız var n (m (n t)), *biz 20*. Alexandre C dediği gibi, Eğer uygun olursak bunu yapabiliriz
swap :: n (m t) -> m (n t)
Diğer n doğru ve join kapsamalıdır 24**.
Zayıf ve başarısız olarak;çift Uygula ve üzerinizde çok daha kolay tanımlamak için
(<<**>>) :: (Applicative a, Applicative b) => a (b (s -> t)) -> a (b s) -> a (b t)
abf <<**>> abs = pure (<*>) <*> abf <*> abs
katmanlar arasında engelleme yok çünkü.
Buna karşılık, iyi gerçekten Monads ekstra güç gerektiğinde, ve uzakta Applicative destekleyen rijit hesaplama yapısı ile alabilirsiniz zaman tanımak için.
Beste monadlar zor olsa da, ihtiyacınız olandan daha fazla olabilir unutmayın, bu arada. Türü m (n v) gösterir hesaplama metkiler, o zaman bilgisayar ile netkileri vdeğer, metkileri bitir önce netkileri start (dolayısıyla swap). Eğer sadece netkileri metkileri aralığı etmek istiyorsanız, o zaman kompozisyon belki sormak için çok fazla!

Kullanarak "Nesne.oluÅŸtur" y...
Nasıl en son git arama bir ant komut d...
Android Studio yeni proje oluÅŸtur Grad...
Linux: kopyala ve eÄŸer varsa hedef diz...
&Quot olmadan iPhone simülatörü;Oluştu...