SORU
24 ŞUBAT 2015, Salı


Endeksli monad nedir?

indexed monad ve bu monad için motivasyon nedir?

Yan etkileri takip etmek için yardımcı olduğunu okudum. Ama yazın, imza ve belgelere her yerde beni takip etmez.

Yan etkileri (veya herhangi bir geçerli örnek) takip edebilmek için nasıl bir örnek olurdu?

CEVAP
24 ŞUBAT 2015, Salı


Her zamanki gibi, insanların kullandığı terminoloji tamamen tutarlı değil. -Çok kavramları ilham--monadlar-ama-kesinlikle-konuşarak değil, çeşitli var. Terim "endeksli monad" bir dizi biridir (dahil olmak üzere "" ve "parametrik monad" (Atkey adı onlar için)) şartlar böyle bir kavramı belirlemek için kullanılan. monadish Eğer ilginizi çekerse (bir daha böyle bir kavram, Katsumata "parametrik etkisi" dönüş endeksli olan bir monoid tarafından dizine, tarafsız ve onun dizinde bağlama birikir.) monad.

Her şeyden önce, bu tür bir kontrol edelim.

IxMonad (m :: state -> state -> * -> *)

Yani, bir tür "" (ya da "eylem" Eğer isterseniz, ama çakacağım "") hesaplama, gibi görünüyor . hesaplama

m before after value

before, after :: state value :: *. Fikri güvenli olduğu harici bir sistem ile etkileşim anlamına gelir yakalamaktahmin edilebilirdevlet kavramı. Bir hesaplama türünü söyler ne devlet olmalı before çalışır, ne devlet olacak after çalışır (gibi düzenli monadlar *) ne tür values hesaplama üretir.

Her zamanki bit ve parçaları bir monad gibi *bilge ve 25**-bilge Domino oynamak gibi.

ireturn  ::  a -> m i i a    -- returning a pure value preserves state
ibind    ::  m i j a ->      -- we can go from i to j and get an a, thence
             (a -> m j k b)  -- we can go from j to k and get a b, therefore
             -> m i k b      -- we can indeed go from i to k and get a b

"(Hesaplama veren fonksiyon) böylece . oluşturulan "Kleisli ok kavramı

a -> m i j b   -- values a in, b out; state transition i to j

ve bir kompozisyon

icomp :: IxMonad m => (b -> m j k c) -> (a -> m i j b) -> a -> m i k c
icomp f g = \ a -> ibind (g a) f

ve her zamanki gibi, yasaları tam olarak ireturn icomp bize bir kategori vermek emin olun

      ireturn `icomp` g = g
      f `icomp` ireturn = f
(f `icomp` g) `icomp` h = f `icomp` (g `icomp` h)

ya da, komedi sahte C/ne olursa olsun Java/

      g(); skip = g()
      skip; f() = f()
{h(); g()}; f() = h(); {g(); f()}

Neden? ""Etkileşim. kurallar modeli Örneğin, eğer sürücü değil mi eğer orada bir dvd çıkarma ve eğer zaten bir tane varsa sürücüsüne bir dvd koyamazsınız. Bu yüzden

data DVDDrive :: Bool -> Bool -> * -> * where  -- Bool is "drive full?"
  DReturn :: a -> DVDDrive i i a
  DInsert :: DVD ->                   -- you have a DVD
             DVDDrive True k a ->     -- you know how to continue full
             DVDDrive False k a       -- so you can insert from empty
  DEject  :: (DVD ->                  -- once you receive a DVD
              DVDDrive False k a) ->  -- you know how to continue empty
             DVDDrive True k a        -- so you can eject when full

instance IxMonad DVDDrive where  -- put these methods where they need to go
  ireturn = DReturn              -- so this goes somewhere else
  ibind (DReturn a)     k  = k a
  ibind (DInsert dvd j) k  = DInsert dvd (ibind j k)
  ibind (DEject j)      k  = DEject j $ \ dvd -> ibind (j dvd) k

Bu, "ilkel" komutları . tanımlayabiliriz

dInsert :: DVD -> DVDDrive False True ()
dInsert dvd = DInsert dvd $ DReturn ()

dEject :: DVDrive True False DVD
dEject = DEject $ \ dvd -> DReturn dvd

hangi Diğerleri ireturn ibind ile monte edilir. Şimdi yazabilirim (do-gösterim borçlanma)

discSwap :: DVD -> DVDDrive True True DVD
discSwap dvd = do dvd' <- dEject; dInsert dvd ; ireturn dvd'

ama fiziksel olarak imkansız değil

discSwap :: DVD -> DVDDrive True True DVD
discSwap dvd = do dInsert dvd; dEject      -- ouch!

Alternatif olarak, bir ilkel komutlar doğrudan tanımlayabilir

data DVDCommand :: Bool -> Bool -> * -> * where
  InsertC  :: DVD -> DVDCommand False True ()
  EjectC   :: DVDCommand True False DVD

ve daha sonra genel bir şablon oluşturmak

data CommandIxMonad :: (state -> state -> * -> *) ->
                        state -> state -> * -> * where
  CReturn  :: a -> CommandIxMonad c i i a
  (:?)     :: c i j a -> (a -> CommandIxMonad c j k b) ->
                CommandIxMonad c i k b

instance IxMonad (CommandIxMonad c) where
  ireturn = CReturn
  ibind (CReturn a) k  = k a
  ibind (c :? j)    k  = c :? \ a -> ibind (j a) k

Aslında, ilkel Kleisli okları ne söyledik, ne bir "domino"), sonra da uygun bir kavram inşa "hesaplama dizisi" onların üzerinde.

Her dizine monad m, "değişiklik yok diyagonal" m i i bir monad, ama genel olarak, m i j değildir. unutmayın Ayrıca, değerleri endeksli değil ama hesaplamaları dizin, dizin oluşturulmuş bir monad monad sadece her zamanki fikri başka bir kategori için örneği değil.

Şimdi, tekrar Kleisli bir ok tipine bak

->m i j b

Devlet i başlamak için olmalıyız biliyoruz, ve herhangi bir devam durumu j başlangıç olacağını tahmin ediyoruz. Biz bu sistem hakkında çok şey biliyor! Bu riskli bir operasyon değil! Sürücü dvd koyduğumuzda, gider! Dvd sürücü ne Devlet her komuttan sonra herhangi bir söz hakkı yok.

Ama dünya ile etkileşim, genel olarak doğru değil. Bazen bazı kontrol vermek ve dünya onu seviyor ne yapalım gerekebilir. Eğer bir sunucu varsa, örneğin, müvekkilin bir seçenek sunmak ve oturum durumu ne tercih bağlıdır. Sunucu "" operasyon sonucunda, devlet belirlemez, ama sunucu yine de devam etmek gerekir. seçim sunuyoruz. "" Yukarıdaki anlamda, çok endeksli monadlar model . çok iyi bir araç değil komut ilkel değil ^em>öngörülemeyensenaryo.

Daha iyi bir araç nedir?

type f :-> g = forall state. f state -> g state

class MonadIx (m :: (state -> *) -> (state -> *)) where
  returnIx    :: x :-> m x
  flipBindIx  :: (a :-> m b) -> (m a :-> m b)  -- tidier than bindIx

Korkunç bisküvi? Çok değil, iki nedenden dolayı. Bir, çünkü oldukça fazla bir monad ne gibi görünüyorbir monad, ama üzerinde (state -> *) yerine *. Eğer Kleisli bir ok türü bakarsanız iki,,

a :-> m b   =   forall state. a state -> m b state

bir hesaplama türüön koşula ve postcondition 52**, tıpkı Eski Güzel Hoare Mantığı. Program mantık olarak onaylamaları yarım altında Curry-Howard yazışma çapraz ve Haskell tür olmak için bir yüzyıl almış. returnIx türü diyor "tutan herhangi bir postcondition, sadece bir şey yaparak elde edebileceğiniz için Hoare Mantığı kuralı olan", "" atlayın. İlgili kompozisyon Hoare Mantığı kuralı ";".

Bitiş ** 54, tüm nicelik koyarak tipine bakarak izin verin.

bindIx :: forall i. m a i -> (forall j. a j -> m b j) -> m b i

foralls Bu zıt kutup var. Başlangıç durumu i ve postcondition a ** 58, başlayabilirsiniz bir hesaplama seçiyoruz. Dünyanın seçer, herhangi bir ara devlet j seviyor, ama bize kanıtlar postcondition b tutar ve böyle bir devlet, biz devam edin b tuşunu basılı tutun. Yani, sırayla, devlet durumu b i elde edebiliriz. Üzerinde kavrama serbest bırakarak "" devletler, model edebiliriz . sonra ^em>öngörülemeyenhesaplamaları.

IxMonad 66 *Her ikisi de yararlıdır. Durumu değiştirmek için saygı, öngörülebilir ve öngörülemeyen, sırasıyla interaktif hesaplamalar her iki model geçerliliği. Öngörülebilirlik almak varken değerlidir, ama kararsızlık bazen hayatın bir gerçeği. Umarım, o zaman, bu cevap endeksli monadlar ne bir işaret, hem de yararlı olmaya başlıyorlar ve zaman zaman tahmin sağlar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • SDSARG3

    SDSARG3

    14 Mart 2009
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011