Kullanım MonadCont uygulamak için MonadRef
37* *bilinen bir sorun vardır.
Ancak aşağıdaki tanım için TAMAM olmalıdır:
class Monad m => MonadCont' m where
callCC' :: ((a -> forall b. m b) -> m a) -> m a
shift :: (forall r.(a -> m r) -> m r) -> m a
reset :: m a -> m a
ve o zaman mantıklı bir örnek bulabilirsiniz. this paper yazar ContT r m
m
MonadFix
MonadRef
uygulanan şartıyla üstüne MonadFix
uygulamak olduğunu iddia etti. Ama eğer MonadRef
var aslında callCC'
yukarıdaki aşağıdaki gibi sağlayabiliriz bence
--satisfy law: mzero >>= f === mzero
class Monad m => MonadZero m where
mzero :: m a
instance (MonadZero m, MonadRef r m) => MonadCont' m where
callCC' k = do
ref <- newRef Nothing
v <- k (\a -> writeRef ref (Just a) >> mzero)
r <- readRef ref
return $ maybe v id r
shift = ...
reset = ...
(Ne yazık ki onlar için uygulamalar sağlar o yüzden söylemedim shift
reset
semantik aşina değilim)
Bu uygulama benim için iyi görünüyor. Sezgisel olarak, ne zaman callCC'
olmak denir, biz yem k
bir işlevi, kendi etki, her zaman başarısız (her ne kadar biz mümkün sağlamak için bir değer yazın keyfi b
, ama biz her zaman sağlamak mzero
tipi m b
ve kanuna göre gereken etkin bir şekilde durdurmak tüm diğer etkileri olmakla hesaplanan) ve yakalar alınan değer olarak nihai sonuç callCC'
.
Benim sorum ise şu:
Bu uygulama beklendiği gibi ideal callCC
için çalışıyor. Uygun anlam *ile 24* reset
de uygulayabilir miyiz?
Yukarıdakilere ek olarak, bilmek istiyorum:
Uygun davranışı sağlamak için MonadRef
bir özelliğini kabul etmek zorundayız. Yasaları yukarıdaki sırada beklendiği gibi davranır uygulama yapmak için MonadRef
ne olurdu?
GÜNCELLEME
Yukarıdaki naif uygulanması yeterince iyi değil çevirin. Tatmin olmak için"" . Devamı mevcut
callCC $\k -> k m === callCC $ const m === m
Uygulama ayarlamak için
instance (MonadPlus m, MonadRef r m) => MonadCont' m where
callCC' k = do
ref <- newRef mzero
mplus (k $ \a -> writeRef ref (return a) >> mzero) (join (readRef ref))
Diğer bir deyişle, MonadZero
orijinal tüm hesaplama iptal etmeden normal bir hesaplama ile mzero
bir değer combind edebilmek için elimizde yeterli değildir.
Yukarıdaki soruya cevap vermez, orijinal girişimi olmaya aday tahrif edildi olarak ayarlanır. Ama güncelleştirilmiş sürümünü, orijinal sorular yine sorular. Özellikle, reset
shift
hala uygulanacak.
CEVAP
(Bu henüz bir cevap değil, ama sadece bazı ipuçları aklımda geldi. Bu başka biri tarafından kendi başıma ya da gerçek cevabı neden olacaktır umarım.)
Call-by-Value is Dual to Call-by-Name -- Philip Wadler
Yukarıdaki yazıda yazar"", yazılı bir matematik klasik mantık karşılık olan. Matematik Çift tanıttı Son bölümde, bir kesimi diyor
-Gerek aramak için bir strateji çift olabilir onun covalue ile bir coterm üzerine yazarak bu verimsizliği önlemek ilk kez değerlendirilir.
Belirtildiği gibi Wadler kağıt, call-by-name değerlendirmek devamı için hevesle (döndürmeden önce tüm değerleri olmak değerlendirilen) buna rağmen call-by-value değerlendirmek devamı tembel (sadece döner sonra tüm değerleri olmak değerlendirilir).
Şimdi, callCC'
yukarıdaki bakmak, bu devamı tarafta arama var çift bir örnek olduğuna inanıyorum. Değerlendirme stratejisi, "devam" işlevi, verilen, ama önbelleği için bu noktada devlet "gerçek" devamı daha sonra. aramaya sahte sağlamaktır Bu şekilde devam etmesi önbelleği yapmak gibi, ve böylece bir kez hesaplama biz bu devamı geri tamamlanır. Ama önbellek değerlendirmeye değer aramadan lazım bunu demek istiyorum.
Şüpheli genel durumu (süresi geçerli noktasına hesaplama) devamı (gelecek hesaplama) çift. Bu birkaç olguları açıklayacak. Eğer bu doğruysa, bu bir sürpriz değil bu MonadRef
(karşılık küresel ve polimorfik devlet) çift MoncadCont
(karşılık küresel ve polimorfik devamı), ve bu yüzden onlar için kullanılabilir uygulamak birbirimizi.
Kullanım D3 ve uygulamak için Parlak `...
Koşullu bir sınıf uygulamak için en iy...
Java singleton deseni uygulamak için e...
Nasıl uygulamak için !önemli kullanıyo...
't neden C# Statik Yöntemler bir ...