Díky moc za další zajímavý díl!
Věci popsané teď se mi (na první pohled) ale už moc nelíbí, přijdou mi takové podezřele nefunkcionální a trochu narušující koncept :) Mám pár otázek (je ranní hodina, takže pokud některé budou mimo mísu, prosím o shovívavost :)
1. K čemu přesně se hodí promise, co by nešlo udělat s future?
Napadá mě třeba použít promise jako semafor: spustím deset vláken s nějakým výpočtem a když jedno výpočet zvládne rychleji, nastaví "proměnnou" (ale fuj! :) a ostatní vlákna už se s výpočtem nemusí párat.
Je to tak, nebo to má ještě nějaké jiné využití?
2. Jak u promise/future fungují výjimky? Když při výpočtu dojde k výjimce, vyhodí se až tehdy, když se pokusím přečíst hodnotu?
3. Co si mám představit pod tím "kopie všech referencí"? Co když chci pracovat s javovským objektem? Provede se (jak?!) hluboká kopie, nebo jenom mělká (takže vlastně transakce s javovskými objekty vůbec nemůžu použít)? Nebo jde o něco úplně jiného?
> Systém v tomto případě jednoduše transakci spustí znova a využije přitom již změněné hodnoty.
Znamená to, že s trochou (ne)štěstí se může transakce opakovat donekonečna? To zavání možným deadlockem...
> Při práci s transakcemi je nutné dbát především na to, aby se do funkce alter předávaly jen takové funkce, které nemají vedlejší efekt.
To je docela blbý. Už je to druhý místo (po lazy sekvencích), kde si na funkce s vedlejším efektem musím dávat pozor. Přijde mi to hodně napraktický a ve skutečné aplikaci si to moc neumím představit - volání se můžou zřetězovat do velké hloubky a zjistit, jestli tam někde je nebo není vedlejší efekt, může být docela problém, ne? Kdybych to chtěl udělat úplně čistě, musel bych si všechny funkce s vedlejším efektem nějak označit s tím, že tenhle flag by se pak šířil do všech funkcí, které je budou volat...
=====
Celkově mi to na první pohled přijde trochu ne-čistý. Pokud u těch transakcí tak jako tak musím dávat pozor na vedlejší efekty, proč nepoužít rovnou úplně stupidní čistě funkcionální přístup, který mi defacto (pokud nemám vedlejší efekty) ACID zaručuje taky?
Erlang:
transfer_money(Balance1,Balance2,Amount) -> {Balance1-Amount,Balance2+Amount}.
Je to tím, že se potenciálně operuje nad javovskými objekty a proto musím mít explicitní transakce? Nebo jaký je důvod funkcionální jazyk komplikovat takovýmihle věcmi?
Předem díky za reakci. Znovu opakuju: pokud jsou otázky mimo mísu, prosím o shovívavost :)