Pořád máš divnou terminologii. Nechápu, proč ji používáš. Shodnem se na tom, že číslo a string jsou různé datové typy? Ano, když sečtu číslo a string, tak to spadne na type error, proto mi není jasné, proč to označuješ za varianty jednoho datového typu. To jsou hodnoty různých datových typů. Na základě čeho to spadne u tebe, když to považuješ za jeden datový typ?
No úplně právě neshodneme. V dynamických jazycích jsou číslo a string vlastně stejný datový typ ("JSValue"), protože ty můžeš zavolat "3 + '6'" - a normálně se to zavolá. A pak někde v tom __add__ se to zkontroluje a případně spadne. Ty přece klidně můžeš sečíst 2 různé třídy a __add__se normálně zavolá, zkus si to, nikde tam k žádné kontrole nedochází. Typy jsou právě statická záležitost....
Nutíš mě zopakovat, co už jsem jednou napsal.
Implementace není podstatná, důležité je, jakou abstrakci ti to poskytuje na venek.Tohle je pochopení, které ti chybí. Ty se nezabýváš vlastním jazykem, ale jeho implementací, a to je chybný přístup. Jazyk je jeho vnější abstrakce, kterou poskytuje programátorovi a na této úrovni se s nim zachází.
Chápej, i statické typy jsou jen vrstva abstrakce nad reálnými daty. Reálná data v paměti jsou jen jedničky a nuly organizované a adresované po bajtech, nic víc, nic míň. Všechno nad tím je abstrakce, kterou ti prg. jazyk nad těmito daty poskytuje. Dynamické jazyky jsou implementované ve statických, a to je to, co tě mate a brání ti uvažovat o dynamickém jazyku o level výš, na jeho úrovni abstrakce.
Datový typ není nic jiného, než definice/informace o těchto reálných datech v paměti, která specifikuje, jak s nimi zacházet. A to platí jak pro statické, tak dynamické jazky, akorát ty dynamické jazyky jsou tlustší o jednu (interpretační) úroveň. Platí, že data jsou nějak reálně uložena v paměti a prg. jazyk programátorovi umožňuje s nimi nějakým definovaným způsobem zacházet. Jakým způsobem to dělá je jeho interní záležitost.
Proto datové typy má i dynamický jazyk a neoznačují se tag, ale typ. V Pythonu máš datové typy a zjišťuješ je funkcí type(), nikoliv tag(), stejně tak to má Lua, obdobně v JS máš typeof nebo v php zase gettype() a tak dále. Snažit se to předefinovat je marná a hoavně hloupá snaha, která tě vede k nesmyslnému tvrzení, že číslo a string je v Pythonu ten samý datový typ.