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
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 value
s 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
forall
s 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.
Bir yardım C# geliştirici anlamak: bir...
Kategorik açıdan FP bir monad, nedir?...
Bir monad nedir?...
Anahtarlık öğesi benzersiz (iOS) nedir...
Arasındaki fark nedir "def" ...