Může být v relaci ekvivalence (===) 1 a "1"? Ne, není to stejná množina (datový typ).
Ale můžete použít ==, které to implicitně přetypuje předtím, než to porovná.
Aha, takže opravdu byl problém v tom, že máte zmatek v pojmu relace na množině.
Krátká odpověď: === je definováno správně, == je definováno špatně. Oba dva operátory jsou definovány pro libovolné typy. Tohle úplně stačí jako důkaz, že vaše argumentace je nesmyslná, typy tady vůbec nehrají roli.
Delší odpověď: aspoň neformálně:
1. To, že je relace R "definovaná na množině" M znamená něco podobného jako definiční obor funkce. Díky tomu vím, že jestliže relace nějaké dva prvky z M "spojuje", tak ty prvky "jsou v relaci", něco pro ně
platí, zatímco když v relaci nejsou (a jsou z M), tak to pro ně
neplatí, a pokud něco není z M, tak o tom prostě R
nic neříká. Například relace "být celočíselně dělitelný" je definovaná třeba pro celá čísla a neříká nic o vztahu mezi prvky množiny savců (netvrdí, že žirafa je dělitelná hrochem, ani že jím dělitelná není, prostě vztah "být dělitelný" nedává pro savce smysl, není pro ně rozumně definovatelný).
2. Relaci nazýváme ekvivalencí právě když je reflexivní, symetrická a tranzitivní. Z toho pak plynou různé praktické důsledky. Například to, že existuje jednoznačný rozklad množiny pomocí relace RE na "třídy ekvivalence" - tj. každému prvku z množiny M (tady vidíme, jak je M důležitá - nemluvíme o hroších, ale o prvcích z M) můžeme jednoznačně přířadit "třídu" - tj. podmnožinu M.
Abysme si znovu ověřili, že o typy vůbec nejde: můžu mít relaci isSameType(x,y), která spojuje hodnoty stejného typu - tj. rozděluje množinu
všech hodnot daného jazyka na podmnožiny podle jejich typu. V jedné třídě rozkladu podle takové ekvivalence jsou pak integery, v jiné stringy.
3. Ano, skutečně 1 a "1" můžou být v relaci i když ta relace je ekvivalencí. Triviálně např relace implementovaná funkcí
function isAnything(x) { return true; }
QED. Tahle funkce sice neimplementuje "operátor ekvivalence" (programátorštinou), ale je to "ekvivalence" (matematicky). Chtít po operátoru ekvivalence, aby byl ekvivalencí, je velmi rozumný požadavek. Viz 2
SHRNUTO: 1. operátor ekvivalence je možné definovat nad různými typy a pořád to může být ekvivalence v matematickém smyslu (důkazem je ===). 2. pokud relace ekvivalencí není, ztrácím různé jistoty, nemůžu o ní tvrdit to, co bych mohl, kdyby ekvivalencí byla. 3. Čili bych měl mít setsakramentsky dobrý důvod, proč se o tyto jistoty připravit. Neměl bych je zahodit (a programátora uvést ve zmatek) jenom proto, aby mohli lidi v mém jazyce patlat páte přes deváte a nedejmatkopřírodo jim to nevyhodilo runtime error.