To je to řešení, které jsem hledal, díky. Připadá mi to teda trochu jako hack
Protože to JE hack. Je to způsob, jak se tvářit, že string má vlastnosti, které nemá*. Nikdo rozumný by to imho v praxi takhle neudělal. Podle mě je správný ten druhý způsob - nadefinovat si třídu s potřebnými funkcemi (class Scitej) a vytvořit implementaci pro všechny typy, které chci podporovat. A pak v té "inkrementační" fci pracovat s touhle třídou (incrementTVar :: Scitej a => ...).
* protože být instancí třídy znamená přesně tohle - mít nějaké vlastnosti. A některé vlastnosti Num prostě pro string neplatí, tak nemá smysl ho tam rvát.
Aha, rigidní matematik... Doporučuju nechat veřejně zostudit všechny tvůrce programovacích jazyků, kteří si dovolili pro operaci spojení řetězců použit operátor +, protože se těžce provili proti a+b=b+a.
Nejde o rigidní matematiku, ale o konzistentní sémantiku. Pokud nějaký operátor má jiný VÝZNAM pro typ A a jiný pro typ B, tak to není dobře. Jestli o tom pochybuješ, užij si, kam to vede, v JavaScriptu

Obecně přece a+b==b+a neplatí.
Pokud "+" má označovat "běžné aritmetické sčítání", tak platí. Pokud to má označovat něco jiného, tak v principu může platit cokoli si pro to "něco jiného" vymyslíme. Jsou i tací koumáci, kteří jsou schopní operátor "+" předefinovat tak, aby dělal print a ještě si myslí, jak jsou chytří

I pokud se pojem "sčítání" používá v nějakém zobecněném/přeneseném smyslu, tak se komutativita afaik bere jako základní nutná vlastnost, bez které by ten pojem ztratil svůj smysl. Viz třeba
https://cs.wikipedia.org/wiki/S%C4%8D%C3%ADt%C3%A1n%C3%AD#Obecn.C3.A1_algebra a
https://en.wikipedia.org/wiki/Addition#Addition_in_abstract_algebraJak říkal správně "v", řetězce se prostě nesčítají, řetězce se řetězí. A pokud bych je kór chtěl sčítat, tak jako vektory - tj. sčítat po prvcích ASCII hodoty. Ale to by asi nebylo k ničemu dobré
