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

  • Phandroid

    Phandroid

    26 Ocak 2009
  • REK Roth Productions

    REK Roth Pro

    8 Ocak 2011
  • The Scary Snowman

    The Scary Sn

    1 ŞUBAT 2011