1/ Paměť neřeším. To ať si vyřeší kompilátor.
Nejde o paměť, ale o typ. Referenci na Age nesmíš změnit na referenci na Int. Ledaže bys měl čítač referencí a ten byl roven jedné.
Předpokládám ale, že uvažuješ o nějakém Haskell-like jazyku, tak na reference prdíme.
Ano, to jsem dostatečně nezdůraznil.
2/ Mě se tam žádnej typ nezměnil. O žádnou informaci jsem nepřišel. Já mám pole Intů. Mám funkci:
No pokud se na to díváš takhle, tak ano, máš pole intů. V tom případě jsi o tu informaci, že "a" je "Age" přišel ve chvíli, kdy jsi "a" vložil do toho pole intů. Tím se totiž z Age stal Int = ztratil jsi informaci o tom, že to číslo je kladné. Odteď už to nevíš.
Nebo řečeno jinak: intuitivně člověk asi očekává, že když do listu něco vloží a pak to z něj vyndá, dostane to samý. Ty ale říkáš, že dostane typ prvku toho listu.
Ne tak docela.
V
List Int může být cokoliv, co se vejde do
Int. Takže i
Age. Když do
List Int dám
Age, tak smím, a bude tam
Age, neproběhne konverze (nedělal bych to). Když ale z
List Int čtu, tak sice můžu zjišťovat, zda nejde o nějaký podtyp, ale nemůžu k tomu přistupovat jako k
List Age, protože je to
List Int. Kompilátor mi bude hlídat, abych k těm položkám nepřistupoval jako k
Age, protože tam samozřejmě může být
Int, a obráceně to už nejde.
Možná trochu zmatenej popis, ale tak viz ten můj Haskell like kód.
Jak jsem říkal, nejsou to neřešitelné problémy, ale je to opruz.
Pokud tě napadá nějaký příklad, stál bych o něj.