2008-09-17 45 views
14

Tương lai là gì? Đó là một cái gì đó để làm với đánh giá lười biếng.Tương lai là gì?

+0

Tương lai không nhất thiết phải thực hiện với Đánh giá Lười biếng. Trong thực tế cho rất nhiều trường hợp sử dụng, tương lai lười biếng là chính xác những gì bạn không cần: IO, Networking, vv ... – brice

+0

"Futures" hiện đang nhận được rất nhiều tiếp xúc thông qua JavaScript! Nhưng thuật ngữ trong lĩnh vực JavaScript là "trì hoãn" và "lời hứa". – hippietrail

Trả lời

3

Một tương lai gói gọn một phép tính trì hoãn, và thường được sử dụng để đánh giá lười biếng shoehorn thành một ngôn ngữ không lười biếng. Lần đầu tiên một tương lai được đánh giá, mã được yêu cầu để đánh giá nó được chạy, và tương lai được thay thế bằng kết quả.

Do tương lai được thay thế, các đánh giá tiếp theo sẽ không thực thi lại mã và chỉ cần mang lại kết quả.

7

Khi bạn tạo một tương lai, một chuỗi nền mới sẽ bắt đầu bắt đầu tính toán giá trị thực. Nếu bạn yêu cầu giá trị của tương lai, nó sẽ chặn cho đến khi chủ đề kết thúc tính toán. Điều này rất hữu ích khi bạn cần tạo một số giá trị song song và không muốn theo dõi tất cả các giá trị theo cách thủ công.

Xem lazy.rb cho Ruby hoặc Scala, futures, and lazy evaluation.

Chúng có thể được thực hiện bằng bất kỳ ngôn ngữ nào có chủ đề, mặc dù rõ ràng sẽ khó khăn hơn trong ngôn ngữ cấp thấp như C so với ngôn ngữ chức năng cấp cao.

+0

AFAIK, tương lai không bắt đầu thực hiện cho đến khi chúng thực sự được yêu cầu. Tương lai thường được sử dụng để xây dựng một rào cản lười biếng, ví dụ: để thực hiện một cấu trúc vô hạn. Nếu tương lai bắt đầu thực hiện ngay lập tức khi tạo ra, họ sẽ không thích hợp cho việc này. – 0124816

+1

@ 012 ...: Kiểm tra các liên kết tôi đã đăng, họ đưa ra tổng quan tốt về tương lai. –

+2

http://en.wikipedia.org/wiki/Futures_and_promises#Distinction_between_futures_and_promises Có vẻ là tham chiếu dứt khoát hơn. (Hah! Wikipedia!) Tóm tắt: Tương lai bắt đầu không được thực hiện đồng thời; bây giờ một số xác định chúng như làm như vậy, và đã đổi tên khái niệm ban đầu là một lời hứa. – 0124816

9

Có một số Wikipedia article về tương lai. Tóm lại, đó là một cách để sử dụng một giá trị chưa được biết đến. Giá trị sau đó có thể được tính theo yêu cầu (đánh giá lười biếng) và, tùy chọn, đồng thời với phép tính chính.

Ví dụ C++ sau.


Giả sử bạn muốn tính tổng của hai số. Bạn có thể phải thực hiện háo hức tiêu biểu:

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)); 

hoặc bạn có thể sử dụng tương lai cách sử dụng C++ 11 của std::async, mà trả về một std::future. Trong trường hợp này, hàm add sẽ chỉ chặn nếu nó cố gắng sử dụng một giá trị chưa được tính toán (người ta cũng có thể tạo ra một thay thế hoàn toàn lười biếng).

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); })); 
6

Mọi người đều đề cập tương lai cho mục đích tính toán lười biếng. Tuy nhiên một cách sử dụng khác không được quảng cáo là việc sử dụng Futures cho IO nói chung. Đặc biệt chúng hữu ích khi tải tệp và chờ trên dữ liệu mạng

0

The Wiki Article cung cấp tổng quan về tương lai. Khái niệm này thường được sử dụng trong các hệ thống đồng thời, để lập kế hoạch tính toán trên các giá trị có thể hoặc chưa được tính toán, và hơn nữa, tính toán của chúng có thể có hoặc có thể chưa được tiến hành.

Từ bài viết:

Một tương lai có liên quan đến một chủ đề cụ thể rằng tính giá trị của nó. Tính toán này có thể được bắt đầu hoặc háo hức khi tương lai là được tạo hoặc lười biếng khi giá trị của nó là trước tiên cần thiết.

Không đề cập trong bài viết, tương lai là một Monad, và vì vậy nó có thể chức năng trên các giá trị tương lai của dự án vào đơn nguyên có họ áp dụng cho các giá trị tương lai khi nó trở nên có sẵn, năng suất tương lai khác mà lần lượt đại diện cho kết quả của hàm đó.

0

Tương lai cũng được sử dụng trong các mẫu thiết kế nhất định, đặc biệt là đối với các mẫu thời gian thực, ví dụ, mẫu ActiveObject, tách riêng phương thức gọi từ thực thi phương thức. Tương lai được thiết lập để chờ đợi cho việc thực hiện hoàn thành. Tôi có xu hướng nhìn thấy nó khi bạn cần phải di chuyển từ một môi trường đa luồng để giao tiếp với một môi trường luồng đơn. Có thể có trường hợp một phần cứng không có hỗ trợ hạt nhân cho luồng, và tương lai được sử dụng trong trường hợp này. Thoạt nhìn nó không rõ ràng làm thế nào bạn sẽ giao tiếp, và tương lai đáng ngạc nhiên làm cho nó khá đơn giản. Tôi có một chút mã C#. Tôi sẽ đào nó ra và đăng nó.

0

This blog post cung cấp giải thích rất kỹ lưỡng cùng với ví dụ về cách bạn có thể tự thực hiện tương lai. Tôi thực sự khuyên bạn nên dùng nó :)

+0

Liên kết không hoạt động nữa - Cảnh báo: Tạo đối tượng mặc định từ giá trị trống ... – mrwaim

Các vấn đề liên quan