Jde o seřazení operací které čtou a mění vnější svět. Samozřejmě že se dají synchronizovat jen změny světa, které udělal ten program. Samo že se ten svět mění i sám o sobě, ale nám jde o řazení našich operací.
Funkcionální jazyky neřeší vedlejší efekty, ale některé základní operace je samozřejmě mají (čtení znaku, souboru, ...), takže se musí nějak zařídit aby překladač ty operace nepřerovnal. Ale u všeho ostatního je to přerovnávání žádoucí.
Dobrá, děkuju. Já jsem Haskellem trochu zasažený (hrál jsem si s ním na úrovni studia nějakých tutoriálů včetně nekonečných pokusů definovat co je monáda a spol., řešení úloh v Projektu Euler, jednodušších praktických prográmků, pročtení Real World Haskell i Learn You a Haskell, Typeclassopedie atd.). Dokonce jsem si chvilku hrál i s Concurrent Cleanem. Takže si troufám tvrdit, že v zásadě rozumím, o čem je řeč, ale nechápu spíš smysl sporu.
Jestliže do-notace definuje akci a v rámci IO monády (jak tady někdo psal, snad to moc nezkomolím) předpisuje akci pro interpret, který interaguje s vnějším světem, samozřejmě fork vlákna způsobí, že už nelze říci, která akce následuje po které. Nicméně se ptám, není porušením deterministického pořadí operací existence funkce typu random(), která samozřejmě existuje v Haskellu a jak koukám do knihoven Cleanu, je tam MersenneTwister a nevím, jak v Haskellu a Cleanu zabránit, aby v závislosti na vrácené hodnotě provedl jednu nebo druhou (třetí) operaci. Nebo samozřejmě to dělení může být na základě hodnoty načtené ze standardního vstupu, což je v zásadě totéž.
Jinými slovy mi přijde spor IO monády vs uniqueness typování poněkud malicherný, jelikož ve skutečnosti je problémem dichotomie funkcionální čistoty a reálného světa, kterou nelze žádným trikem přelstít, tudíž žádný prakticky použitelný jazyk nelze označit za čistě funkcionální, ale jsou jazyky, ve kterých lze napsat modul, který čistě funkcionální je, nicméně k tomu, aby dokázal alespoň vypsat výsledek výpočtu, potřebuje slupku, která udělá akci, jež vede k tomu výpisu. Haskell nabízí mechanismus pro vytvoření takové slupky, jenže ta slupka ožije až tím interpreterem, bez něj je to pořád jenom předpis a ne živá slupka.
No a teď zpátky k tomu forku - je samozřejmě poněkud nepříjemné, že nám z jednoho jabka vzniknou dvě a tudíž rozumování o výsledku bytí původně jednoho jabka ve světě je podstatně složitější, ale konečně složitější. Jenomže základní složitost není ve forkovitosti nebo IOMonádovitosti, ale ve slupkovitosti reálného programu.
Tudíž na jednu stranu chápu tvrzení, že Haskell není čistě funkcionální jazyk, na druhou stranu ale žádný prakticky použitelný jazyk není čistě funkcionální, tudíž striktní a úzká definice je dosti neužitečná.