Tôi có một danh sách các id chuỗi biểu diễn các bản ghi DB. Tôi muốn tải chúng từ DB một cách không đồng bộ, sau đó tải từng bản ghi lên máy chủ từ xa một cách không đồng bộ, sau đó khi tất cả được tải lên xong, hãy ghi lại các id của các bản ghi đã được tải lên.TraversableOnce, Future và Option trong Scala for comprehension
Vì tôi đang sử dụng Scala 2.9.2, tôi đang sử dụng triển khai Core-util của Twitter trong tương lai, nhưng nó sẽ hoạt động giống như 2.10 tương lai về biến đổi Monadic.
Khái niệm chung là thế này:
def fetch(id: String): Future[Option[Record]]
def upload(record: Record): Future[String]
def notifyUploaded(ids: Seq[String]): Unit
val ids: Seq[String] = ....
Tôi đang cố gắng để làm điều này thông qua một cho sự hiểu biết nhưng thực tế là lấy lợi nhuận một Tương lai của Tùy chọn làm cho nó tối nghĩa và mã không biên dịch:
for {
id <- ids
maybeRecord <- fetch(id)
record <- maybeRecord
uploadedId <- upload(record)
} yield uploadedId
Biên dịch này kết quả trong các lỗi sau:
scala: type mismatch;
found : com.twitter.util.Future[String]
required: Option[?]
uploadedId <- upload(record)
^
tôi mi gì ssing? tại sao trình biên dịch mong đợi uploadId là một Option? là có cách nào đẹp, tôi có thể làm việc xung quanh này?
thể trùng lặp của [Type Mismatch trên Scala Đối Hiểu] (http://stackoverflow.com/questions/4719592/type-mismatch-on-scala-for-comprehension) –
Một đơn nguyên là một monoid trong danh mục ** Endo ** - functors. Chỉ cần nói ' – folone
@folone: Tôi sợ rằng không phải ai cũng sẽ có được [trò đùa] (http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the-category-of -endofunctors-whats-the-problem). Chỉ cần nói ' –