Đối với phần hiểu được chuyển đổi thành các cuộc gọi đến phương thức map
hoặ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 flatMap
lời gọi phương thức. Vì flatMap
trên một List
trả 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 Seq
s.)
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 flatMap
cuộ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 đó Option
không phải là một kiểu con của Seq
, như thường được giả định.