Bunun hakkında biraz düşündüm. Asıl mesele, genel olarak, polimorfik tipin bir değerinin ne kadar büyük olduğunu bilmiyoruz. Bu bilgiye sahip değilseniz, bir şekilde almanız gerekir. Monomorfizasyon, polimorfizmi uzmanlaştırarak bu bilgiyi sizin için alır. Boks, her şeyi bilinen bir boyutta temsil ederek bu bilgiyi sizin için alır.
Üçüncü bir alternatif de bu bilgileri çeşitlerde takip etmektir. Temel olarak, yapabileceğiniz her veri boyutu için farklı bir tür tanıtmaktır ve daha sonra polimorfik fonksiyonlar belirli bir boyutun tüm tipleri üzerinde tanımlanabilir. Aşağıda böyle bir sistemi çizeceğim.
ÇeşitleriTip yapıcılarκbir: : = N: : =|∀ a : κ .bir|α|A × B|A + B|A → Br e fbir|P a d ( k )|μ α : κ .bir
Burada, üst düzey fikir, bir türün size bir nesneyi hafızaya yerleştirmek için kaç kelime gerektiğini anlatmasıdır. Herhangi bir boyut için, belirli boyuttaki tüm tiplerde polimorfik olmak kolaydır. Her tür - hatta polimorfik olanlar - hala bilinen bir boyuta sahip olduğundan, derleme C için olduğundan daha zor değildir.
Sıralama kuralları bu İngilizceyi matematiğe dönüştürür ve şöyle görünmelidir:
Γ ⊢ A : n Γ ⊢ B : m
α : n ∈ ΓY olan ⊢ a : n,Γ , α : n ⊢ A : mY olan ⊢ ∀ a : n .A : m
Γ ⊢ A : m Γ ⊢ B : nΓ ⊢ A : nΓ ⊢ B : mY olan ⊢ A x B : n + m,Γ ⊢ A : nΓ ⊢ B : nΓ ⊢ A + B : n + 1
Y olan ⊢ A : mΓ ⊢ B : nY olan ⊢ A → B : 1Γ ⊢ A : nΓ ⊢ r e fA : 1
A ⊢ P a d ( k ) : kΓ , α : n ⊢ A : nY olan ⊢ u a : n .A : n
A × BbirB
Referanslar ilginçtir - işaretçiler her zaman bir kelimedir, ancak herhangi bir boyuttaki değerlere işaret edebilirler. Bu, programcıların
boks yaparak keyfi nesnelere polimorfizm uygulamasını sağlar , ancak bunu
yapmalarını gerektirmez . Son olarak, açık boyutlar oynandıktan sonra, alan kullanan ancak hiçbir şey yapmayan bir dolgu türü tanıtmak genellikle yararlıdır. (Eğer bir int ve bir çift ints ayrık birliği almak istiyorsanız, ilk int dolgu eklemek gerekir, böylece nesne düzeni düzgün.)
Özyinelemeli türler standart oluşum kuralına sahiptir, ancak özyinelemeli olayların aynı boyutta olması gerektiğine dikkat edin, bu da türlemenin çalışması için bunları genellikle bir işaretçiye yapıştırmanız gerektiği anlamına gelir. Örneğin, liste veri türü şu şekilde temsil edilebilir:
μ α : 1.r e f( P a d ( 2 ) + i n t × α )
Bu, boş bir liste değerine veya bir çift int ve bağlı başka bir listeye işaretçi anlamına gelir.
Bunun gibi sistemler için tip kontrolü de çok zor değildir; Joshua Dunfield ile ICFP makalemdeki algoritma, Yüksek Sıralama Polimorfizmi için Tam ve Kolay Çift Yönlü Tipik Kontrol , neredeyse hiç değişiklik yapılmadan bu durum için geçerlidir.