Здесь я определяю crossProduct
как функцию, которая должна возвращать кортежи для всех возможных пар элементов из левого списка с элементами из правого списка.
object CrossProduct {
def crossProduct[A, B](left: TraversableOnce[A], right: TraversableOnce[B]): TraversableOnce[(A, B)] = {
for {
l <- left
r <- right
} yield (l, r)
}
def main(args: Array[String]): Unit = {
val left = Vector("A", "B", "C")
val right = Vector("1", "2", "3", "4")
println("With Vector, Vector")
crossProduct(left, right).foreach(println)
println("With Iterator, Vector")
crossProduct(left.toIterator, right).foreach(println)
println("With Vector, Iterator")
crossProduct(left, right.toIterator).foreach(println)
println("With Iterator, Iterator")
crossProduct(left.toIterator, right.toIterator).foreach(println)
}
}
Когда я передаю векторв качестве аргумента right
он возвращает правильные результаты.Когда я передаю итератор в качестве аргумента right
, он не может перейти ко второму элементу аргумента left
.Почему это происходит?
With Vector, Vector
(A,1)
(A,2)
(A,3)
(A,4)
(B,1)
(B,2)
(B,3)
(B,4)
(C,1)
(C,2)
(C,3)
(C,4)
With Iterator, Vector
(A,1)
(A,2)
(A,3)
(A,4)
(B,1)
(B,2)
(B,3)
(B,4)
(C,1)
(C,2)
(C,3)
(C,4)
With Vector, Iterator
(A,1)
(A,2)
(A,3)
(A,4)
With Iterator, Iterator
(A,1)
(A,2)
(A,3)
(A,4)