Sıra polimorfizmi ve alt tipleme arasındaki temel farklar nelerdir?


20

Satır polimorfizminin alt tiplemeden daha iyi bir yaklaşım olduğunu sık sık duyuyorum, ancak bunları ayrıntılı olarak karşılaştıran bir şey bulmakta zorlanıyorum. Özellikle sistemin bir kullanıcısıyla ilgileniyorum.

Bu blog yazısına rastladım , ama bana eskisinden daha fazla soru bırakıyor. Örneğin, alt türüne sahip bir sistemin bir tür atayacağını iddia ederken, satır türüne sahip bir sistem başka bir tür atayacaktır; Bu, alt türü olan bir sistemin "satır yazma" türünü atarsa, hatalı olduğunu düşündüğü anlamına mı gelir?

Gördüğüm en büyük fark, satır yazmanın argüman türlerini hizalamayı mümkün kılmasıdır (yani, yalnızca aargümanlarının alanıyla ilgilenen ancak argümanlarının aynı alanlara sahip olmasını gerektiren iki argüman işlevi yazın ). .

Yanıtlar:


10

Alt tipleme bir tür ifade verildiğinde başka bir tür de verebiliriz diyor. Birincisinin ikincisinin bir alt tipi olduğunu ve bu alt tip ilişkisinin başka birçok ilişkiye neden olduğunu söylüyoruz. Sembollerde,

ΓE:SS<:TΓE:T

(α.τ)<:τ[T/α]T

{1:A,2:B}<:{2:B,1:A}{1:A,2:B}{2:B,1:A}STS<:TT<:S{1:A,2:B}={2:B,1:A}T<:T

Genellikle alt tipli bir dil hakkında konuştuğumuzda, zemin tipleri üzerinde önemsiz olmayan bir alt tip ilişkisi olan , yani serbest değişkenleri olmayan tipler (tabii ki zemin dışı tipler için alt tip ilişkileri oluşturabilen ve üretecek) anlamına gelir. Dolayısıyla, Roy gibi sıra polimorfizmi olan bir sistem, bu anlamda alt tipleme içeren bir dil değildir, ancak örtük olarak somutlaştırılmış herhangi bir parametrik polimorfik dilden gelen önemsiz alt tip ilişkisine sahiptir. Yapısal alt tipleme ise zemin türleri için önemsiz alt tip ilişkilerini açıkça belirtmektedir.

Tarafından satır türleri , bir eşdeğer ya da yukarıda tarif edildiği gibi önemsiz olmayan bir birleşme olması anlamına gerekir. Bu olmadan, satır türleri iç içe tuples'den biraz daha fazladır. Not, sıra tipleri parametrik polimorfizmden bağımsızdır; Satır değişkenlerini ima etmek istemiyorum. hakkındaki tartışmadan()yukarıda, yapısal alt tipleme satır tiplerini ifade eder, bunun tersi de geçerlidir. Parametrik polimorfizm sıra tiplerine veya yapısal alt tiplemeye diktir (sahip olabileceğiniz veya sahip olamayacağınız, kesinlikle etkileşimler vardır). Yapısal alt tipleme + parametrik polimorfizmi olan bir sistem, ikincisindeki her terimin birincisinde aynı tiple yazılabilmesi anlamında sıra tipi + parametrik polimorfizmi (bir çeşit "kayıt birliği" varsayarak) üstlenir. Birincisi sadece ek tiplerle yazabilir. Brian'ın örneğini kullanarak, yapısal alt tipleme ve parametrik polimorfizm içeren bir sistemde answer, satır yazma sürümü ile aynı tipte olurdu, ancak alt tip sürümünün tipi de olacaktır .

ρ{ c : Number }bilgi: bir alt tipten bir süper tipe geçmek (tip) bilgisini kaybeder. Bu genellikle istediğiniz şey olabilir: önemsediğiniz ortak bir tür var ve diğer her şey alakasız ayrıntılar. Taraflılığım, mümkün olduğunca fazla tür bilgisini korumak ve yalnızca açıkça atmaktır. Alt tiplemenin yaklaşımının dezavantajları genellikle tip doğru olan programlar tarafından kanıtlanır, ancak türler (n bilgisiz) "üst" tipe, örneğin boş kayıtlara itildikleri için. Tekrarlama, parametrik polimorfizm (genel olarak) tip bilgisini korur, alt tipleme kasıtlı olarak kaybeder.


Ayrıntılı yanıt için teşekkürler! Başka bir soru: yapısal alt tipleme + parametrik polimorfizm satır yazmayı + parametrik polimorfizm geçirirse, ikincisini neden hiç kullanasınız?
Alex R

@AlexR Brian'ın blog yazısında bahsettiği gibi, alt tip, tip çıkarım ve bahsettiğim ergonomik sorun gibi diğer pek çok yönüyle son derece kötü etkileşime giriyor. Uygulama ve dil karmaşıklığı sorunları da var. Adil olmak gerekirse, hem "satır türleri" hem de alt türler için geniş bir tasarım alanı vardır, bu nedenle "subsumes" kaba bir ifadedir.
Derek Elkins SE
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.