有一个维基百科的文章有关期货交易.简而言之,它是一种使用尚未知道的值的方法.然后可以根据需要(惰性评估)计算该值,并且可选地,与主计算同时计算该值.
C++示例如下.
假设您要计算两个数字的总和.您可以拥有典型的热切实施:
int add(int i, int j) { return i + j; }
// first calculate both Nth_prime results then pass them to add
int sum = add(Nth_prime(4), Nth_prime(2));
Run Code Online (Sandbox Code Playgroud)
或者你可以使用C++ 11的期货方式std::async,它返回一个std::future.在这种情况下,该add函数仅在尝试使用尚未计算的值时才会阻塞(也可以创建纯粹的惰性替代).
int add(future<int> i, future<int> j) { return i.get() + j.get(); }
int sum = add(async(launch::async, [](){ return Nth_prime(4); }),
async(launch::async, [](){ return Nth_prime(2); }));
Run Code Online (Sandbox Code Playgroud)
创建未来时,将启动一个新的后台线程,开始计算实际值.如果您请求未来的值,它将一直阻塞,直到线程完成计算.当您需要并行生成某些值并且不想手动跟踪所有值时,这非常有用.
请参阅lazy.rb for Ruby,或Scala,future 和lazy evaluation.
它们可能可以用任何带有线程的语言实现,但在C等低级语言中显然比在高级函数式语言中更难.
Future 封装了延迟计算,通常用于将惰性求值硬塞到非惰性语言中。第一次评估 future 时,将运行评估它所需的代码,并用结果替换 future。
由于 future 被替换,后续的计算不会再次执行代码,而只是产生结果。