SORU
12 AĞUSTOS 2011, Cuma


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
12 AĞUSTOS 2011, Cuma


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!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • SignatureSeries

    SignatureSer

    24 Aralık 2006