Nepřipadá mi, že by to umělo retry, jak je použito v tom příkladu výše? Pletu se?
Nepleteš se, retry to neumí, ale zkus přijmout, že retry i případný timeout je naprosto minoritní funkcionalita, kterou si snadno doděláš. Trochu jsem si s tím v C++ hrál a zajímalo by mě, jestli tohle dokážeš napsat stejně elegantně a abstraktně i v Haskellu? Uznávám, že je to trochu školometský příklad:
#include <string>
#include <thread>
#include <iostream>
template<typename T>
class ThreadSafeClass
{
public:
ThreadSafeClass() : m_value(T()) {}
T get() const {
return m_value;
}
ThreadSafeClass& operator += (const T value) {
__transaction_relaxed { m_value += value; }
return *this;
}
private:
T m_value;
};
template<typename T>
void updateThread(ThreadSafeClass<T>& tsc, const T value)
{
for (int i = 0; i < 100; ++i) {
tsc += value;
}
}
int main()
{
ThreadSafeClass<int> safeInt;
ThreadSafeClass<double> safeDouble;
ThreadSafeClass<std::string> safeString;
std::thread t1([&]{updateThread(safeInt, 1);});
std::thread t2([&]{updateThread(safeInt, 2);});
std::thread t3([&]{updateThread(safeDouble, 1.0);});
std::thread t4([&]{updateThread(safeDouble, 2.0);});
std::thread t5([&]{updateThread(safeString, std::string("A"));});
std::thread t6([&]{updateThread(safeString, std::string("B"));});
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
t6.join();
std::cout << safeInt.get() << std::endl;
std::cout << safeDouble.get() << std::endl;
std::cout << safeString.get() << std::endl;
return 0;
}
Obecná třída pro thread safe operaci + nad libovolným datovým typem (včetně stringu), máš to kompletní i s testem. Pokud vím, v Haskellu to musí být TVar? V C++ žádné takové omezení není, může to být libovolná proměnná.