SORU
27 ŞUBAT 2014, PERŞEMBE


Düzensiz delik tipi çözünürlük

Geçenlerde deliller üzerinde desen eşleştirme ile birlikte tip delik Haskell oldukça güzel Agda gibi bir deneyim sağlar. Örneğin:

{-# LANGUAGE
    DataKinds, PolyKinds, TypeFamilies, 
    UndecidableInstances, GADTs, TypeOperators #-}

data (==) :: k -> k -> * where
    Refl :: x == x

sym :: a == b -> b == a
sym Refl = Refl 

data Nat = Zero | Succ Nat

data SNat :: Nat -> * where
    SZero :: SNat Zero
    SSucc :: SNat n -> SNat (Succ n)

type family a   b where
    Zero     b = b
    Succ a   b = Succ (a   b)

addAssoc :: SNat a -> SNat b -> SNat c -> (a   (b   c)) == ((a   b)   c)
addAssoc SZero b c = Refl
addAssoc (SSucc a) b c = case addAssoc a b c of Refl -> Refl

addComm :: SNat a -> SNat b -> (a   b) == (b   a)
addComm SZero SZero = Refl
addComm (SSucc a) SZero = case addComm a SZero of Refl -> Refl
addComm SZero (SSucc b) = case addComm SZero b of Refl -> Refl
addComm sa@(SSucc a) sb@(SSucc b) =
    case addComm a sb of
        Refl -> case addComm b sa of
            Refl -> case addComm a b of
                Refl -> Refl 

Bu gerçekten güzel bir şey olduğunu ben yerine sağ tarafın Refl -> exp yapılar ile bir tür delik, ve benim delik hedef tür güncelleme ile kanıt, oldukça fazla olan rewrite şeklinde Agda.

Ancak, bazen bu delik sadece güncelleme başarısız:

( .) :: SNat a -> SNat b -> SNat (a   b)
SZero    . b = b
SSucc a  . b = SSucc (a  . b)
infixl 5  .

type family a * b where
    Zero   * b = Zero
    Succ a * b = b   (a * b)

(*.) :: SNat a -> SNat b -> SNat (a * b)
SZero   *. b = SZero
SSucc a *. b = b  . (a *. b)
infixl 6 *.

mulDistL :: SNat a -> SNat b -> SNat c -> (a * (b   c)) == ((a * b)   (a * c))
mulDistL SZero b c = Refl
mulDistL (SSucc a) b c = 
    case sym $ addAssoc b (a *. b) (c  . a *. c) of
        -- At this point the target type is
        -- ((b   c)   (n * (b   c))) == (b   ((n * b)   (c   (n * c))))
        -- The next step would be to update the RHS of the equivalence:
        Refl -> case addAssoc (a *. b) c (a *. c) of
            Refl -> _ -- but the type of this hole remains unchanged...

Eğer Agda gelen her şeyi ben yapıştırırsanız hedef türleri mutlaka geçirmez iç hat yok olsa da, hala iyi durumda:

mulDistL' :: SNat a -> SNat b -> SNat c -> (a * (b   c)) == ((a * b)   (a * c))
mulDistL' SZero b c = Refl
mulDistL' (SSucc a) b c = case
    (sym $ addAssoc b (a *. b) (c  . a *. c),
    addAssoc (a *. b) c (a *. c),
    addComm (a *. b) c,
    sym $ addAssoc c (a *. b) (a *. c),
    addAssoc b c (a *. b  . a *. c),
    mulDistL' a b c
    ) of (Refl, Refl, Refl, Refl, Refl, Refl) -> Refl

Bu neden oluyor herhangi bir fikir (ya da kanıtı yeniden nasıl yapabileceğim sağlam bir şekilde) var mı?

CEVAP
31 Temmuz 2014, PERŞEMBE


Tüm Cevap bağlantısı nasıl bulunur inanıyorum. Google kod ,kod oturumu terk gitmemi değil yaptığınız, hangi istemci diyor ve boş olmamalı.

if (!mClient.hasSession()) {
// ignore if no session
return;

/*******Dinlenme kodu********* ulaşılamaz olurdu/ }

 @Override
public void pause() {
if (!mClient.hasSession()) {
// ignore if no session
return;
}
if (DEBUG) {
Log.d(TAG, "pause");
}
mClient.pause(null, new SessionActionCallback() {
@Override
public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
logStatus("pause: succeeded", sessionId, sessionStatus, null, null);
if (mCallback != null) {
mCallback.onPlaylistChanged();
}
}
@Override
public void onError(String error, int code, Bundle data) {
logError("pause: failed", error, code);
}
});
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Artorius FullPower

    Artorius Ful

    29 Temmuz 2007
  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • HouseholdHacker

    HouseholdHac

    6 Kasım 2007