2014-06-14 21 views
13

Bu veri türü, coerce öğesinin, listeye geçmeye gerek kalmadan öğelere uygulanan yeni türler eklemek veya kaldırmak için kullanılmasına olanak tanıyan type role HCons' representational representational olabilir. bu GADT'nin aslında tür rol temsilciliği var

data HNil' = HNil' 
data HCons' a b = HCons' a b 

Ancak bu listelere için sözdizimi, ben convert between these two representations bir sınıf var aşağıdaki GADT

data HList (l::[*]) where 
    HNil :: HList '[] 
    HCons :: e -> HList l -> HList (e ': l) 

olanlar kadar güzel Prime (HList [a,b]) ~ HCons' a (HCons' b HNil') böyle değildir. Bu sınıf

güvenli midir?

+0

FWIW, evet, öyle düşünüyorum. Ama aslında ikna edici bir argüman yapmak için rollerin içselleri hakkında yeterince bilgim yok. Örneğiniz, mevcut rol sisteminin yeterince etkileyici olmadığı başka bir durum gibi görünüyor. – kosmikus

cevap

2

Kendi başına bir dönüşümün varlığının yeterli olduğunu düşünmüyorum.

newtype Age = Age Int 

data Foo a where 
    I :: Bool -> Int -> Foo Int 
    A :: Age -> Bool -> Foo Age 

class ConvFoo a where 
    toFoo :: (Bool, a) -> Foo a 
    fromFoo :: Foo a -> (Bool, a) 

instance ConvFoo Int where 
    toFoo (b, i) = I b i 
    fromFoo (I b i) = (b, i) 

instance ConvFoo Age where 
    toFoo (b, a) = A a b 
    fromFoo (A a b) = (b, a) 

Ben de trivially benzer bir UnFoo tip fonksiyonu tanımlayabiliriz: Örneğin, aşağıdakiler de bana GADT ve türleri mecburi çifti arasında dönüştürmek, ama kesinlikle doğrudan GADT zorlamayı güvenli olmaz sağlar Prime.

Ben iki örnek arasındaki temel fark sizinki '[] ve e':l aynı gösterimi yok oysa maden, Age ve Int, aynı gösterimi yok olduğunu düşünüyorum. Başlığında önerdiği gibi

Yani l o l1 ve l2 aynı temsilleri varsa HList l1 ve HList l2 aynı gösterime sahiptir bu tür bariz çünkü, temsil rolünü yazın olduğu, halen söyleyerek bir durum var. Bununla birlikte, teoride temsiller uygulamaya bağlı olduğundan, GHC'yi doğrudan kabul edene kadar bunu kesinlikle güvenli olarak değerlendirebileceğinizi düşünmüyorum.

+0

"l1 ve l2 aynı gösterimlere sahipse, HList l1 ve HList l2'nin aynı gösterimlere sahip olduğu açıkça ortada" olduğundan emin değilim. HCons :: (el ~ (e ': l)) => e -> HList l -> HList el 'yazabiliriz. O zaman ghc, 'e, el, l' türlerine referans veren 'el ~ (e': l) 'için bir şey saklar ve şu anda kurucuda olanları değil midir? – aavogt

+0

O zaman bile, her bir 'HCons', diğer tüm 'HCons'lar ile aynı yüzey temsiline sahip olur, değil mi? Yani eğer 'e' ve 'HList' de aynı temsillere sahip olsaydı, o zaman bütün 'HCons'lar olurdu. –

+0

Anahtar nokta şudur: '': 've' '[] 'farklı olması gereken somut türler, bu yüzden' HCons 've' HNil 'kafa karıştırıcı riski yoktur. Tam olarak durumun nasıl formüle edileceğine emin değilim! –