SORU
16 HAZİRAN 2014, PAZARTESİ


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
3 Temmuz 2015, Cuma


(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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoklubZAPRESIC

    AutoklubZAPR

    17 Mayıs 2011
  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • The Exploiteers

    The Exploite

    4 Ocak 2011