Parametrik polimorfizm - Parametric polymorphism

İçinde Programlama dilleri ve tip teorisi, parametrik polimorfizm bir dili tam statik olarak korurken, bir dili daha anlamlı kılmanın bir yoludur tip güvenliği. Parametrik kullanma çok biçimlilik, bir işlev veya bir veri türü, değerleri işleyebilmesi için genel olarak yazılabilir aynı şekilde türlerine bağlı olmaksızın.[1] Bu tür işlevler ve veri türleri denir genel işlevler ve genel veri türleri sırasıyla ve temelini oluşturur genel programlama.

Örneğin, bir işlev eklemek iki listeyi birleştiren öğe türlerini önemsemeyecek şekilde oluşturulabilir: tamsayı listelerini, gerçek sayı listelerini, dizelerin listelerini vb. ekleyebilir. Bırak tip değişken a listelerdeki öğelerin türünü belirtir. Sonra eklemek yazılabilir

forall a. [a] × [a] -> [a]

nerede [a] tür öğelere sahip listelerin türünü belirtir a. Biz türünü söylüyoruz eklemek dır-dir tarafından parametrelendirilmiş tüm değerleri için a. (Yalnızca bir tür değişkeni olduğundan, işlevin yalnızca herhangi bir liste çiftine uygulanamayacağına dikkat edin: çift ve sonuç listesi aynı tür öğelerden oluşmalıdır.) Her yer için eklemek uygulanır, bir değer belirlenir a.

Takip etme Christopher Strachey,[2] parametrik polimorfizm ile karşılaştırılabilir ad hoc polimorfizm, burada tek bir polimorfik fonksiyon, uygulandığı argüman (lar) ın türüne bağlı olarak bir dizi farklı ve potansiyel olarak heterojen uygulamaya sahip olabilir. Bu nedenle, ad hoc polimorfizm genellikle sadece sınırlı sayıda bu tür farklı türleri destekleyebilir, çünkü her tür için ayrı bir uygulamanın sağlanması gerekir.

Tarih

Parametrik polimorfizm ilk olarak programlama dillerine tanıtıldı ML 1975'te.[3] Bugün var Standart ML, OCaml, F #, Ada, Haskell, Merkür, Görsel Prolog, Scala, Julia, Python, TypeScript, C ++ ve diğerleri. Java, C #, Visual Basic .NET ve Delphi her biri parametrik polimorfizm için "jenerik" tanıttı. Tip polimorfizmin bazı uygulamaları, yüzeysel olarak parametrik polimorfizme benzerdir ve aynı zamanda ad hoc yönler sunar. Bir örnek C ++ şablon uzmanlığı.

Polimorfizmin en genel biçimi "üst düzey cezalandırıcı polimorfizm ". Bu formun iki popüler kısıtlaması, sınırlı sıra polimorfizmidir (örneğin, rank-1 veya prenex polimorfizm) ve öngörücü polimorfizm. Birlikte, bu kısıtlamalar, esasen ML'de ve Haskell'in erken sürümlerinde bulunan polimorfizm formu olan "preneks öncesi polimorfizmi" verir.

Daha yüksek dereceli polimorfizm

Derece-1 (prenex) polimorfizmi

İçinde prenex polimorfik sistem, tür değişkenleri polimorfik türlerle somutlaştırılamaz.[4] Bu, "ML-tarzı" veya "Let-polimorfizmi" olarak adlandırılan şeye çok benzer (teknik olarak ML'nin Let-polimorfizminin birkaç başka sözdizimsel kısıtlaması vardır). Bu kısıtlama, polimorfik ve polimorfik olmayan tipler arasındaki ayrımı çok önemli hale getirir; bu nedenle tahmin sistemlerinde polimorfik tipler bazen şu şekilde anılır: tip şemaları onları bazen adı verilen sıradan (monomorfik) türlerden ayırmak için monotipler. Bunun bir sonucu, tüm türlerin tüm niceleyicileri en dıştaki (prenex) konuma yerleştiren bir biçimde yazılabilmesidir. eklemek türü olan yukarıda açıklanan işlev

forall a. [a] × [a] -> [a]

Bu işlevi bir çift listeye uygulamak için, değişken yerine bir tür değiştirilmelidir. a işlevin türünde, argümanların türü sonuçta ortaya çıkan işlev türü ile eşleşecek şekilde. Bir cezalandırıcı sistemde, ikame edilen tip, kendisi polimorfik olan bir tip dahil olmak üzere herhangi bir tip olabilir; Böylece eklemek her türden öğeye sahip liste çiftlerine uygulanabilir - hatta polimorfik işlevlerin listelerine de uygulanabilir: eklemek ML dilinde polimorfizm öngörücüdür.[kaynak belirtilmeli ] Bunun nedeni, diğer kısıtlamalarla birlikte öngörülebilirliğin, tip sistemi yeterince basit bu kadar dolu tür çıkarımı her zaman mümkündür.

Pratik bir örnek olarak, OCaml (soyundan veya lehçesinden ML ) tür çıkarımı gerçekleştirir ve impredicative polimorphism'i destekler, ancak bazı durumlarda impredicative polymorphism kullanıldığında, programcı tarafından bazı açık tür ek açıklamaları sağlanmadıkça sistemin tür çıkarımı eksik kalır.

Sırak çok biçimlilik

Sabit bir değer için k, sıra-k polimorfizm, bir niceleyicinin solunda görünmeyebileceği bir sistemdir. k veya daha fazla ok (yazı bir ağaç olarak çizildiğinde).[1]

Çıkarım türü rank-2 polimorfizmi için karar verilebilir, ancak rank-3 ve üstü için yeniden yapılanma karar verilmez.[5]

Sıran ("daha yüksek sıralı") polimorfizm

Sıran polimorfizm, niceleyicilerin rastgele birçok okun solunda görünebildiği bir polimorfizmdir.

Öngörülebilirlik ve impredicativite

Tahmine dayalı polimorfizm

Öngörücü parametrik polimorfik bir sistemde, bir tür bir tür değişkeni içeren böyle bir şekilde kullanılamaz polimorfik tipte somutlaştırılmıştır. Tahmini tip teorileri şunları içerir: Martin-Löf Tip Teorisi ve NuPRL.

İmpredikatif polimorfizm

İmpredikatif polimorfizm (olarak da adlandırılır birinci sınıf polimorfizm) parametrik polimorfizmin en güçlü şeklidir.[6] Bir tanım olduğu söyleniyor cezalandırıcı kendine atıfta bulunuyorsa; tür teorisinde bu, bir türdeki bir değişkenin somutlaştırılmasına izin verir polimorfik türler dahil olmak üzere herhangi bir türle, örneğin kendisi. Buna bir örnek, Sistem F tip değişkeni ile X tipte , nerede X hatta başvurabilir T kendisi.

İçinde tip teorisi, en sık incelenen empredikatif yazılan λ-calculi şunlara dayanıyor lambda küpü, özellikle Sistem F.[1]

Sınırlı parametrik polimorfizm

1985 yılında Luca Cardelli ve Peter Wegner izin vermenin avantajlarını fark etti sınırlar tip parametrelerinde.[7] Çoğu işlem, veri türleri hakkında biraz bilgi gerektirir, ancak aksi takdirde parametrik olarak çalışabilir. Örneğin, bir maddenin bir listeye dahil olup olmadığını kontrol etmek için, maddeleri eşitlik açısından karşılaştırmamız gerekir. İçinde Standart ML, formun parametrelerini yazın ’’ A eşitlik işleminin kullanılabilir olması için sınırlandırılmıştır, dolayısıyla işlevin türü olacaktır ’’ A × ’’ A liste → bool ve ’’ A sadece tanımlanmış eşitliğe sahip bir tür olabilir. İçinde Haskell sınırlama, türlerin bir tip sınıfı; bu nedenle aynı işlevin türü vardır Haskell'de. Parametrik polimorfizmi destekleyen nesneye yönelik programlama dillerinin çoğunda, parametreler şu şekilde sınırlandırılabilir: alt türler belirli bir türden (bkz. Alt tip polimorfizmi ve hakkındaki makale Genel programlama ).

Ayrıca bakınız

Notlar

  1. ^ a b c Pierce 2002.
  2. ^ Strachey 1967.
  3. ^ Milner, R., Morris, L., Newey, M. "Dönüşlü ve polimorfik tiplerle Hesaplanabilir Fonksiyonlar İçin Bir Mantık", Proc. Programları Kanıtlama ve Geliştirme KonferansıArc-et-Senans (1975)
  4. ^ Benjamin C. Pierce; Benjamin C. (Profesör Pierce, Pennsylvania Üniversitesi) (2002). Türler ve Programlama Dilleri. MIT Basın. ISBN  978-0-262-16209-8.
  5. ^ Pierce 2002, s. 359.
  6. ^ Pierce 2002, s. 340.
  7. ^ Cardelli ve Wegner 1985.

Referanslar