SORU
16 NİSAN 2012, PAZARTESİ


Typeclasses arasında ayrım MonadPlus, Alternatif ve Monoid?

Standart kütüphane Haskell MonadPlus, Alternative Monoid aslında aynı mantığı ile iki yöntem sağlar Her typeclasses:

  • Boş bir değer: 14*, empty *mempty.
  • Birlikte typeclass değerleri birleştiren bir operatör a -> a -> a: mplus, <|> mappend.

Her üç hangi durumlarda uygun olur bu yasalar belirtin:

mempty `mappend` x = x
x `mappend` mempty = x

Böylece, üç typeclasses sağlama alıyoraynıyöntemleri.

(Alternative some sağlar ve many ama kendi varsayılan tanımları genellikle yeterlidir, ve bu soru açısından çok önemli değiller.)

Yani, benim sorgu: neden son derece benzer bu üç dersin? Farklı sınıf kendi kısıtlamaları dışında aralarında herhangi bir fark var mı?

CEVAP
16 NİSAN 2012, PAZARTESİ


MonadPlus Monoid farklı amaçlara hizmet.

Monoid sanki bir tür üzerinde parametreli *.

class Monoid m where
    mempty :: m
    mappend :: m -> m -> m

ve bu yüzden diğerinden daha açık bir operatör var ve bir birimi olan hemen hemen her tür için oluşturulmuş olabilir.

Ancak MonadPlus sadece monoidal bir yapısı var, ama aynı zamanda bu yapısı Monad nasıl çalıştığı ile ilgili olduğunu belirtirvebu yapı değeri monad bulunan umursamıyor ki, bu (kısmen) MonadPlus biraz tartışma * -> * alır gerçeği ile gösterilir.

class Monad m => MonadPlus m where
    mzero :: m a
    mplus :: m a -> m a -> m a

Monoid yasalarına ek olarak, MonadPlus uygulayabiliriz yasaları iki potansiyel setleri var. Ne yazık ki, toplum olarak ne olması gerektiği için aynı fikirde değil.

En azından biliyoruz

mzero >>= k = mzero

ama diğer iki rakip uzantıları (sic) sol dağıtım hukuku vardır

mplus a b >>= k = mplus (a >>= k) (b >>= k)

ve kanun yakalamak bıraktı

mplus (return a) b = return a

Yani MonadPlus herhangi bir örneğini veya bu ek kanunlar her ikisini de tatmin etmelidir.

Ne Alternative hakkında?

Applicative tanımlanmış sonra Monad ve mantıklı ait olarak bir üst sınıfı Monad ama büyük ölçüde nedeniyle farklı baskılar üzerine geri tasarımcılar içinde Haskell 98, hatta Functor değildi bir üst Monad kadar 2015. Şimdi nihayet DZD (henüz dil bir standart.) Monad bir üst sınıf olarak Applicative

Etkili, Alternative MonadPlus 51 ** ne 49**.

Bunlar için alırdık

empty <*> m = empty

MonadPlus ile ve mevcut benzer dağıtıcı ve yakalama özellikleri var ne benzer şekilde, tatmin etmelisin en az bir.

Ne yazık ki, empty <*> m = empty bile yasa çok güçlü bir iddia. Örneğin Backwards için hiç tutarlı değil!

MonadPlus baktığımızda, ^ boş< . (g = boş yasa bize zorlanır neredeyse. Boş inşaat herhangi bir işlevi neyse f ara vermek. yok

Ancak, Applicative olduğu içindeğilMonad 58 *bir üst sınıftırdeğilMonadPlus biz bir üst sınıf ayrı ayrı iki örnek tanımlama rüzgar.

Applicative Monad, bir üst sınıf olsa bile ayrıca, MonadPlus sınıf neyse, eğer itaat yapsak bile, çünkü lazım olur diye

empty <*> m = empty

bunu kesinlikle ispat için yeterli değildir

empty >>= f = empty

Öyle bir şey MonadPlus iddia daha kuvvetli olduğunu iddia ediyor Alternative.

Şimdi, kongre tarafından, belirli bir türü için MonadPlus Alternative kabul etmeli, ama Monoid olabilirtamamenfarklı.

Örneğin Maybe MonadPlus Alternative açık bir şey yapın:

instance MonadPlus Maybe where
    mzero = Nothing
    mplus (Just a) _  = Just a
    mplus _        mb = mb

ama Monoid örnek Monoid içine bir semigroup asansörler. 98, yani bir Monoid ama birimini kullanarak değil requring tarafından zarar Haskell zamanda Semigroup bir sınıf mevcut değildi, çünkü ne yazık ki. ಠ_ಠ

instance Monoid a => Monoid (Maybe a) where
    mempty = Nothing
    mappend (Just a) (Just b) = Just (mappend a b)
    mappend Nothing x = x
    mappend x Nothing = x
    mappend Nothing Nothing = Nothing

TL;DRMonadPlus daha güçlü bir iddia daha Alternative bunun yanı sıra güçlü bir iddia daha Monoid ve MonadPlus Alternative örnekleri için bir tip olması ile ilgili, Monoid olabilir bazen tamamen farklı bir şey.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Apple

    Apple

    22 HAZİRAN 2005
  • bigky226

    bigky226

    11 HAZİRAN 2006
  • Creavite

    Creavite

    8 Mart 2009