Đối với phần hiểu được chuyển đổi thành các cuộc gọi đến phương thức maphoặc flatMap. Ví dụ cái này:
for(x <- List(1) ; y <- List(1,2,3)) yield (x,y)
trở thành:
List(1).flatMap(x => List(1,2,3).map(y => (x,y)))
Do đó, giá trị vòng lặp đầu tiên (trong trường hợp này, List(1)) sẽ nhận được flatMaplời gọi phương thức. Vì flatMaptrên một Listtrả về một khác List, kết quả của cho sự hiểu tất nhiên sẽ là a List. (Điều này mới đối với tôi: Vì sự hiểu biết không phải lúc nào cũng dẫn đến luồng, thậm chí không nhất thiết phải bằng Seqs.)
Bây giờ, hãy xem cách flatMapđược khai báo trong Option:
def flatMap [B] (f: (A) ⇒ Option[B]) : Option[B]
Giữ điều này trong tâm trí. Hãy xem làm thế nào để hiểu sai (cái có Some(1)) được chuyển đổi thành một chuỗi các lệnh gọi bản đồ:
Some(1).flatMap(x => List(1,2,3).map(y => (x, y)))
Bây giờ, thật dễ dàng thấy rằng tham số của flatMapcuộc gọi là thứ trả về a List, nhưng không phải là Option, theo yêu cầu.
Để khắc phục sự cố, bạn có thể làm như sau:
for(x <- Some(1).toSeq ; y <- List(1,2,3)) yield (x, y)
Điều đó biên dịch tốt. Cần lưu ý rằng đó Optionkhông phải là một kiểu con của Seq, như thường được giả định.