na otazku, proc se typ mnozina neimplementuje v jazycich vicemene odpovida i joy... s tim, ze jde pouzit jenom na primitivni typy, coz je velice omezujici a coz plyne i z toho, ze kdyz chceme mit mnoziny aspon trochu efektivni tak potrebujeme nejake to "rozumne" usporadani... jinak si muze vystacit s obycejnym seznamem...
Pokud má jazyk podporu definice hash funkce pro složené typy (v ideálním případě i pro uživatelsky definované typy), není důvod použití množiny takto omezovat. Jasně, Joy je minimalistický, chápu některé jeho výhody. Ale používat bych ho asi moc nechtěl.
Spíš než hešovací funkce je důležité definovat ekvivalenci. Hešovací funkce může v některých případech fungovat (ono vlastně to mapování ASCII kód->číslo 0..31 je taky hešovací funkce), ale kvůli kolizím ne vždy, hlavně pro větší objekty. Samozřejmě že například pro hešovací mapy nebo hešovací seznamy to (většinou) nevadí, ale u množin by to mohlo dělat neplechu.
Jenže při neexistenci hešovací funkce nebo něčeho podobného (dovedu si množinu představit třeba jako asociativní pole, B-strom, nebo v nejhorším jako vektor s použitím binárního vyhledávání) bude vyhledávání v množině velice neefektivní. Podpora definované ekvivalence je samozřejmě v drtivé většině případů nutná - pokud to nemá být Set of char nebo něco takového.
To je určitě pravda. Možná jsem špatně pochopil tvůj návrh. Myslel jsem, že heše (divné slovo) by byly přímo prvky množin, ale to by v případě kolize nefungovalo dobře (i když by to mohlo být pekelně rychlé). Pokud by byla množina byla opravdu implementována hešpolem, B-stromem apod., tak to samozřejmě je ok.
Spíš jsem v prvním příspěvku nedopověděl, co jsem měl na mysli. Asociativní pole mě napadlo automaticky a ten hash (či heš ;) jsem chtěl dát na místo toho klíče.
On ten problém je vlastně už v tom, že prakticky žádný jazyk uspokojivě a rychle neřeší problematiku ekvivalence, tj. určení, kdy jsou nějaké dva objekty skutečně ekvivalentní (to je u množin poměrně zásadní). Dobře to funguje pro základní (primitivní) datové typy, hůře již pro kontejnery nebo objekty (OOP). V Javě se to např. řeší metodou equals(), ale opět - porovnávat například pole je vlastně rekurzivní činnost, kterou je nutné doprogramovat, samotný jazyk to neřeší. Když toto není možné vyřešit dostatečně rychle, nebudou rychle fungovat ani množiny.