SORU
15 Ocak 2011, CUMARTESİ


Adjunctions olarak monadlar

Kategori teoride monadlar da okudum. Monadlar bir tanımı eşlenik funktor bir çift kullanır. Bir monad gidiş-dönüş bir o funktorlar kullanılarak tanımlanır. Görünüşe göre adjunctions kategori teoride çok önemli ama eşlenik funktor açısından Haskell monadlar herhangi bir açıklama görmedim. Kimseye verilen bir düşünce mi?

CEVAP
15 Ocak 2011, CUMARTESİ


Edit: Sadece eğlence için, bunu doğru yapacağım. Orijinal cevap aşağıda korunmuş

Kategori ekstralar için kod şimdi adjunctions paketi geçerli adjunction: http://hackage.haskell.org/package/adjunctions

Sadece devlet monad ile açıkça ve basitçe çalışacağım. Bu kod transformers paketi Data.Functor.Compose kullanır, ama aksi takdirde kendi kendine yeten.

F arasında bir adjunction (- ^D . C) ve g (C ->D) yazılı f| g, çeşitli şekillerde karakterize edilebilir. İki doğal dönüşümler veren counit/birim (epsilon/eta) açıklama, (funktorlar arasında morfizmaları) kullanacağız.

class (Functor f, Functor g) => Adjoint f g where
     counit :: f (g a) -> a
     unit   :: a -> g (f a)

"Gerçekten C kimlik eşleme olduğunu counit" ve "" ünitesinde gerçekten D . kimlik eşleme bir bir not

Ayrıca, hom-set counit/biriminden adjunction tanımı tanımı geri dönebilirdik.

phiLeft :: Adjoint f g => (f a -> b) -> (a -> g b)
phiLeft f = fmap f . unit

phiRight :: Adjoint f g => (a -> g b) -> (f a -> b)
phiRight f = counit . fmap f

Her durumda, artık böyle birim/counit bizim adjunction bir Monad tanımlayabiliriz:

instance Adjoint f g => Monad (Compose g f) where
    return x = Compose $ unit x
    x >>= f  = Compose . fmap counit . getCompose $ fmap (getCompose . f) x

Şimdi arasında klasik adjunction (a) uygulamak ve (a ->):

instance Adjoint ((,) a) ((->) a) where
    -- counit :: (a,a -> b) -> b
    counit (x, f) = f x
    -- unit :: b -> (a -> (a,b))
    unit x = \y -> (y, x)

Ve şimdi bir tür eşanlamlı

type State s = Compose ((->) s) ((,) s)

Ve eğer biz bu kadar yük ghci, Devlet tam olarak klasik devlet bizim monad olduğunu teyit edebiliriz. Ters kompozisyon alıp Costate bu Comonad (mağaza comonad aka) alabiliriz unutmayın.

Bu şekilde monadlar içine yapabiliriz diğer adjunctions bir grup var ((Bool) bir Çift gibi), ama garip monadlar çeşit ediyorlar. Ne yazık ki Okuyucu ve Yazar Haskell doğrudan hoş bir şekilde teşvik eden adjunctions yapamayız. BizolabilirDevam, ama copumpkin açıklar gibi, bu aslında bir "farklı", "bazı oklar tersine çevirir" typeclass. Eşlenik şeklinde kullanması karşısında bir kategoriden bir adjunction gerektirir, Bu form da adjunctions paketinde farklı bir modülde uygulanır.

bu malzeme Derek Elkins' Monad madde Kategori Teorisi ile 13 -- Hesaplama Monadlar Okuyucu: http://www.haskell.org/wikiupload/8/85/TMR-Issue13.pdf . tarafından farklı bir şekilde korunur

Ayrıca, Program İyileştirme kağıt için Hinze son Kan Uzantıları listesi Mon Setarasındaki adjunction gelen monad inşaatı yürüyor: http://www.cs.ox.ac.uk/ralf.hinze/Kan.pdf


Eski cevap:

İki referanslar.

1) Kategori-ekstralar, her zaman olduğu gibi, monadlar kendilerine kaynaklanan nasıl adjunctions gösterimi ve sunar. Her zamanki gibi, düşünmek iyi, ama belgelere göre oldukça hafif.: http://hackage.haskell.org/packages/archive/category-extras/0.53.5/doc/html/Control-Functor-Adjunction.html

2) -Cafe de adjunction rolü umut verici ama kısa bir tartışma sunuyor. Hangi kategori-ekstra yorumlamada yardımcı olabilir: http://www.haskell.org/pipermail/haskell-cafe/2007-December/036328.html

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • Trulia

    Trulia

    29 Kasım 2006
  • William Hyde

    William Hyde

    23 HAZİRAN 2008