Myślałem o tym trochę. Głównym problemem jest to, że ogólnie nie wiemy, jak duża jest wartość typu polimorficznego. Jeśli nie masz tych informacji, musisz je jakoś zdobyć. Monomorfizacja otrzymuje te informacje, specjalizując się w polimorfizmie. Boks otrzymuje te informacje, umieszczając wszystko w reprezentacji o znanej wielkości.
Trzecią alternatywą jest śledzenie tego rodzaju informacji. Zasadniczo można wprowadzić inny rodzaj dla każdego rozmiaru danych, a następnie można zdefiniować funkcje polimorficzne dla wszystkich typów określonego rozmiaru. Naszkicuję taki system poniżej.
KindsType constructorsκA::=n::=|∀a:κ.A|α|A×B|A+B|A→BrefA|Pad(k)|μα:κ.A
Tutaj idea wysokiego poziomu polega na tym, że rodzaj tekstu mówi, ile słów potrzeba, aby ułożyć obiekt w pamięci. Dla każdego danego rozmiaru łatwo jest być polimorficznym we wszystkich typach tego konkretnego rozmiaru. Ponieważ każdy typ - nawet polimorficzny - nadal ma znany rozmiar, kompilacja nie jest trudniejsza niż w przypadku C.
α:n∈ΓΓ⊢α:nΓ,α:n⊢A:mΓ⊢∀α:n.A:m
Γ⊢A:nΓ⊢B:mΓ⊢A×B:n+mΓ⊢A:nΓ⊢B:nΓ⊢A+B:n+1
Γ⊢A:mΓ⊢B:nΓ⊢A→B:1Γ⊢A:nΓ⊢refA:1
Γ⊢Pad(k):kΓ,α:n⊢A:nΓ⊢μα:n.A:n
A×BAB
Odnośniki są interesujące - wskaźniki są zawsze jednym słowem, ale mogą wskazywać na wartości dowolnej wielkości. Pozwala to programistom na implementację
polimorfizmu do dowolnych obiektów przez boksowanie, ale nie wymaga od
nich tego. Wreszcie, gdy w grę wchodzą wyraźne rozmiary, często przydatne jest wprowadzenie rodzaju wypełnienia, który wykorzystuje miejsce, ale nic nie robi. (Jeśli więc chcesz wziąć rozłączną sumę liczby całkowitej i pary liczb całkowitych, musisz dodać dopełnienie pierwszej liczby wewnętrznej, aby układ obiektu był jednolity.)
Typy rekurencyjne mają standardową regułę formowania, ale należy pamiętać, że wystąpienia rekurencyjne muszą być tego samego rozmiaru, co oznacza, że zwykle trzeba je nakleić wskaźnikiem, aby można było wykonać sortowanie. Np. Typ danych listy można przedstawić jako
μα:1.ref(Pad(2)+int×α)
Oznacza to więc pustą wartość listy lub parę liczb całkowitych i wskaźnik do innej połączonej listy.
Sprawdzanie typu dla takich systemów również nie jest bardzo trudne; algorytm w mojej pracy ICFP z Joshua Dunfieldem, Pełne i łatwe dwukierunkowe sprawdzanie typów polimorfizmu wyższego stopnia dotyczy tego przypadku bez prawie żadnych zmian.