Evrensel türler varoluşçu türlerin bir alt türü mü, yoksa özel bir durumu mu?


20

Evrensel olarak nicelendirilmiş bir tip : T a = X : { a X , f : X { T , F } } , varoluşsal olarak nicelenmiş bir alt tip mi, yoksa özel bir durum mu olduğunu bilmek istiyorum tip , T e aynı imza ile: T e = X : { a X , f : X { T , K } }Ta

Ta=X:{aX,f:X{T,F}}
Te
Te=X:{aX,f:X{T,F}}

XX

X,P(X)?X,P(X).

Bir yerde yanlış mıyım?

Arka plan: Bunu neden soruyorum?

"Soyut [Veri] Türlerinin Varoluşçu Türleri" nin neden ve nasıl olduğunu anlamak için varoluşçu türleri inceliyorum . Bu kavramı sadece teoriden iyi anlayamıyorum; Somut örneklere de ihtiyacım var.

Ne yazık ki, iyi kod örneklerini bulmak zordur çünkü çoğu programlama dili varoluşçu türler için sınırlı bir desteğe sahiptir. (Örneğin, Haskellforall veya Java'nın ?joker karakterleri .) Diğer yandan, evrensel olarak nicelenen türler "jenerikler" yoluyla birçok yeni dil tarafından desteklenmektedir.

Daha da kötüsü, jenerikler de varoluşsal tiplerle kolayca karışıyor gibi görünüyor , varoluşçu evrensel tiplerden ayırmayı daha da zorlaştırıyor. Bu karışımın neden bu kadar kolay gerçekleştiğini merak ediyorum. Bu sorunun cevabı bunu açıklayabilir: Evrensel türler gerçekten de varoluşçu türlerin özel bir örneğiyse, genel türlerin, örneğin Java'ların List<T>her iki şekilde de yorumlanabileceği şaşırtıcı değildir .


1
Evrensel ve varoluş arasındaki fark nedir?

Matematiksel olarak, haklısınız: Eğer forall x. P(x)öyleyse exists x. P(x). Tipleri kontrol ederken tip sistemlerinin bunu dikkate alıp almadığı ... Hiçbir fikrim yok. İlginç bir soru için +1.

1
@deinan: P (x) herhangi bir x için tutmazsa , kesinlikle PxP (x) tutmaz. Muhtemelen x olmadığında , yani ∀x∈XP (x) demek değildir ∃x∈XP (x) ise = X ∅ .

1
... Ve bunlar, ayarlanmış gösterim olmadan yeniden yazılırsa, farklı görüneceklerini unutmayın: ∀xx∈X⇒P (x) ile ∃xx∈X & P (x) ve bu ∃xx∈X⇒P (x) X'ten olmayan herhangi bir x tarafından önemsiz bir şekilde tatmin olacaktır .

1
Güzel soru. Haskell'de, bir tür değerin (forall b. Show b => b), (forall b. B) alan bir fonksiyona geçirilebileceği, bunun tersine değil, beklediğiniz ikame edilebilirliği ima ettiği kesinlikle doğrudur. bir alt tip ilişkisi. Ancak elbette türler hakkında konuştuğunuzda, özellikle semantiğiniz için resmi bir tip cebiriniz varsa, baktığınız yazım sisteminden bahsetmelisiniz ...

Yanıtlar:


10

x:T,P(x)x:T,P(x)T

(x:T,P(x))(x:T,P(x))Ta , bir üst kümesidir.Te değil, aynı tip. (Aslında bir üst küme değildir; bir üst kümeye izomorfiktir.)

Ta=X.{bir:X,f:XbÖÖl}birbir(M)M:XM1M2XA(M1)A(M2)Ta

Te=X.{a:X,f:Xbool}BTeN:Xπ1(B)=Nπ2(B)={a:N,f:Nbool}N

Haskell'in yanıltmasın forall : ismine rağmen bu bir tür varoluşsal niceliktir.

Arka plan için, Türleri ve Programlama Dillerini şiddetle tavsiye ediyorum (bölüm 23 ve 24 sırasıyla evrensel türleri ve varoluş türlerini tartışmaktadır). Araştırma makalelerini anlamak için yararlı bir arka plan sağlayacaktır.


1
Bir küçük ve oldukça geç bir kelime oyunu - Haskell forall, üst düzey tanımlamalar için açık bir şekilde ifade ettiği örtülü nicelleştirmenin orijinal bağlamında evrensel bir nicelleştiricidir. Böyle bir tanımın "iç" kısmında, argümanları manipüle ederken, polimorfik tipler etkili bir şekilde varoluşsaldır; her tür değişkeni bir türe bağlıdır, ancak bu türün ne olduğunu bilmiyoruz (ve bilemeyiz). Bildiğim kadarıyla, hiçbir Haskell uygulaması gerçek (ham, üst düzey) varoluş türlerini desteklemez ve bana hangi amaca hizmet edeceğini bile açık değildir.
CA McCann

1
GHC tarafından desteklenen varoluşçu tipler (doğrudan veya dolaylı olarak) "dışarıdan" görülen kontravaryant pozisyonda meydana gelen evrensel nicelleştiricilere sahip tiplerdir. Bu, mantıksal olumsuzlama ile kabaca aynı ikiliği kullanır, bu nedenle, üst düzeyde varoluşçu tiplere sahip olmak için, CPS benzeri bir kodlama kullanarak iki kez kontravaryant olmalıdırlar (bu, Uday Reddy'un verdiği eşdeğerdir). Sezgisel olarak varoluşsal niceleyicilerin benzer nedenlerle benzer zorluklar sunduğunu unutmayın.
CA McCann

5

X.P(X)X.P(X) genellikle doğrudur. Sadece türlerin tüm koleksiyonu boşsa başarısız olur, bu nadiren olur.

X.(Xx(XBÖÖl))XX.(Xx(XBÖÖl))

 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

Varoluşçu türler için bahsettiğiniz makale biraz teoriktir. Daha öğretici bir makale Cardelli ve Wegner'ın makalesi: Tipleri, veri soyutlamasını ve polimorfizmi anlama üzerine . Programlama dilleri hakkındaki ileri düzeydeki ders kitaplarının çoğunda varoluşçu türler hakkında bazı tartışmalar olacaktır. Aramak için iyi bir kitap Mitchell'in Programlama Dillerinin Temelleri olacaktır .

Çoğu programlama dilinin açıkça varoluşçu tiplere sahip olmadığı konusunda haklısınız. Bununla birlikte, birçoğunun soyut türleri vardır (veya "paketler" veya "modüller" gibi başka bir adla). Dolayısıyla, birinci sınıf varlıklar gibi değerleri ele almasalar bile varoluşçu türlerin değerlerini ifade edebilirler .

X.P(X)Y.(X.P(X)Y)Y

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.