> Ne. Komunikace mezi thready je v IO, takže se je potřeba ze StateT vyliftovat ven, poslat stav jinam a v přijímacím threadu to zase spustit přes runStateT nebo. nějaký "local". Takže threadLocal by určitě fungoval.
Máte pravdu v Haskellu to zřejmě bude, jak říkáte - nedošlo mi (dokud jsem si to nezkusil), že forkovací funkce berou IO x a nikoliv StateT s IO x. V jazycích, kde můžete funkci přerušit (například pomocí vymezených kontinuací) a pak pustit na jiném vlákně, se stavová monáda bude lišit od thread local proměnné.
> Zrovna algebr. datové typy a polymorfismus jsou něco, co v kódu vypadá prakticky přesně "opačně" a z hlediska rozšiřitelnosti to má opačné vlastnosti
Měl jsem na mysli to, že u data X = A | B | C můžete X chápat jako nadtyp a A, B, C jako podtypy. Toto chápání nám dovolí ADT modelovat v OO jazyce - X, A, B, C budou třídy a zakázáním vytváření dalších podtypů z X, A, B a C dostaneme ADT jako v Haskellu. Když podtypy nezakážete dostanete otevřený ADT, to umí například OCaml (samozřejmě umí i uzavřené):
type attr = .. type attr += Str of string type attr += | Int of int | Float of float