Mě tam zase zaujalo to vztekání se ohledně Race Condition. Je fakt, že když je něco funkcionální podle té čumilově definice, tak k souběhu nesmí dojít. Představuji si naivní situaci, kdy jedna funkce v sobě volá jinou funkci, která čeká na vrácení hodnoty předchozí funkce. Každopádně, když použiji dvě funkce (forknuté ze stejného IO), které čtou ze stejného souboru (zamčeného), tak se prostě zaseknou bez ohledu na to, že jsou monadické. (Trošku vařím z vody, k forkIO jsem se ještě nedostal.) A vzhledem k tomu, že se zaseknou, tak je porušena funkcionálnost.
Jako ve výsledku vlastně jde jen o to, že když něco nazveš nějak, tak od toho taky něco očekáváš. A když od jazyka, který o sobě tvrdí, že je pure funkcional, a on pak ve skutečnosti není, tak to naštve. Když by se řeklo, že Haskell je "pure funkcional s výhradou", tak by byl třeba čumil spokojenej.
Ale Safe Haskell s IO monádou bez věcí jako unsafePerformIO, unsafeCoerce atd., je čistě funkcionální - definici splňuje bez výhrad (všechny výrazy tam jsou referenčně transparentní). Rovněž tam funguje substituční model, když zkoumáte chování programů.
Ale v normálním Haskellu tedy funkce jako
unsafePerformIO,
unsafeCoerce atd. jsou, takže takovej Haskell není čistě funkcionální. Obvykle se bavíme o Haskellu, ne o Safe Haskellu (to abyste mě neařkli ze slovíčkaření). I na wikině je, že
Safe Haskell je čistě funkcionální. Na několika místech. Takže si dovedu představit jak se při čtení něčeho takového musí čumil vztekat.
Bohužel o tom, jak funguje Uniqueness typing vím kulové, takže nemohu argumentovat. Chápal jsem to tak, že z nějaké, jakési, definice se musí jednat vždy o jednu instanci (představil jsem si to jak UID, u kterého by mě taky naštvalo, když by nějaká aplikace měla stejné jako já.) Pokud to tak není, tak budu jen rád, když se tu o tom rozkecáte podobně jako čumil :-)