2014-12-21 16 views
5

Tôi đang đọc blog này post tuyên bố Futures không phải là "chức năng" vì chúng chỉ là trình bao bọc của các tính toán có hiệu lực phụ. Ví dụ: chúng chứa các cuộc gọi RPC, yêu cầu HTTP, v.v. Có đúng không?Tương lai ở Scala có thực sự hoạt động không?

Các bài viết trên blog đưa ra ví dụ sau đây:

def twoUsersFeed(a: UserHandle, b: UserHandle) 
       (implicit ec: ExecutionContext): Future[Html] = 
    for { 
    feedA <- usersFeed(a) 
    feedB <- usersFeed(b) 
    } yield feedA ++ feedB 

you lose the desired property: consistent results (the referential transparency). Also you lose the property of making as few requests as possible. It is difficult to use multi-valued requests and have composable code.

tôi sợ tôi không nhận được nó. Bạn có thể giải thích cách chúng tôi mất consistent result trong trường hợp này không?

Trả lời

11

Bài đăng trên blog không vẽ được sự phân biệt thích hợp giữa số Future và cách nó được sử dụng phổ biến, IMO. Bạn có thể viết mã chức năng thuần túy với Future, nếu bạn chỉ viết Future s được gọi là hàm tổng, thuần túy; mã như vậy sẽ được tham chiếu trong suốt và "chức năng" trong mọi ý nghĩa hợp lý từ xa của từ đó.

Điều gì là đúng là Future s cho phép bạn kiểm soát giới hạn các tác dụng phụ, nếu bạn sử dụng chúng với các phương pháp có tác dụng phụ. Nếu bạn tạo Future gói webClient.get, thì việc tạo Future sẽ gửi một cuộc gọi HTTP. Nhưng đó không phải là một thực tế về Future, đó là một thực tế về webClient.get!

Có một số sự thật trong bài đăng trên blog này. Tách biệt thể hiện tính toán của bạn từ việc thực thi nó, hoàn toàn, thông qua ví dụ: các đơn nguyên miễn phí, có thể dẫn đến hiệu quả hơn và kiểm tra mã. Ví dụ. bạn có thể tạo "ngôn ngữ truy vấn", nơi bạn thể hiện một thao tác như "tìm nạp các ảnh hồ sơ của tất cả bạn bè chung của A và B" mà không thực sự chạy nó. Điều này giúp kiểm tra xem logic của bạn có chính xác hay không (vì nó rất dễ thực hiện ví dụ như việc thực hiện thử nghiệm có thể "chạy" cùng các truy vấn - hoặc thậm chí chỉ kiểm tra "đối tượng truy vấn" trực tiếp) và, như tôi nghĩ bài đăng trên blog đang cố gắng đề xuất, có nghĩa là bạn có thể kết hợp nhiều yêu cầu để tìm nạp cùng một cấu hình. (Điều này thậm chí không hoàn toàn là một vấn đề lập trình chức năng - một số sách OO có ý tưởng về một "mẫu lệnh" - mặc dù các công cụ lập trình hàm IME như cú pháp for/yield giúp dễ dàng làm việc theo cách này). Trong khi tất cả những gì bạn có là phương thức fetchProfile, khi chạy, ngay lập tức kích hoạt yêu cầu HTTP, thì nếu logic mã của bạn yêu cầu cùng một cấu hình hai lần, không có cách nào để tránh tìm nạp cùng một cấu hình hai lần.

Nhưng điều đó không thực sự là về Future mỗi lần và IMO bài đăng trên blog này khó hiểu hơn là hữu ích.

+0

Cảm ơn bạn. Bây giờ nó là rõ ràng. Tôi thích ý tưởng tách tính toán biểu đạt và thực thi nó. Sẽ xem xét 'Free monad' – Michael

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