val l = List(1,2,3)
val t = List(-1,-2,-3)
我可以做這樣的事情?
for (i <- 0 to 10) yield (l(i)) yield (t(i))
基本上我想爲每次迭代產生多個結果。
val l = List(1,2,3)
val t = List(-1,-2,-3)
我可以做這樣的事情?
for (i <- 0 to 10) yield (l(i)) yield (t(i))
基本上我想爲每次迭代產生多個結果。
目前還不清楚你在詢問什麼 - 你期望多重收益的語義是什麼。但有一件事是,你可能永遠都不想使用索引來導航列表 - 每個對t(i)的調用都是O(i)來執行。
所以這裏有一個可能性,你可能會問了
scala> val l = List(1,2,3); val t = List(-1,-2,-3)
l: List[Int] = List(1, 2, 3)
t: List[Int] = List(-1, -2, -3)
scala> val pairs = l zip t
pairs: List[(Int, Int)] = List((1,-1), (2,-2), (3,-3))
而這裏的,你可能會問了
scala> val crossProduct = for (x <- l; y <- t) yield (x,y)
crossProduct: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
後來的另一種可能性是
scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}}
crossProduct2: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
只是語法糖
第三種可能性是你想交錯它們
scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r
interleaved: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
這對
scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)}
interleaved2: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
顯然不是。我嘗試時遇到編譯錯誤。
它看起來像.. yield是一個表達式。你不能有兩個產量,因爲這不是表達式的一部分。
如果你想產生多個值,爲什麼不把它們作爲一個元組或列表產生?
例如:
for(t <- List(1,2,3); l <- List(-1,-2,-3))
yield (t, l)
也許產量是不是最好的方法?也許簡單的數組附加可以在這裏使用。
使用收益率和使用列表之間沒有語義差異。實際的區別涉及內存使用情況,其中大型組合的收益率更高。 – Christopher 2009-07-16 21:09:28
不,您不能使用多個yield子句,但有解決方法。例如:
for (i <- 0 to 10;
r <- List(l(i), t(i)))
yield r
您可以窩,內涵,當然,但是這將導致元素的列表,我不相信這是你想要的清單。
警告,這個解決方案是O(n^2) – 2009-07-17 02:29:17
對於l&t列表,我會承認他的例子。如果t&l是數組或函數,情況並非如此,對嗎? – 2009-07-17 03:30:29
這裏語法糖是在一個未知的號碼列表的一個未知的,不同數量的元件的類型無關的解決方案:
def xproduct (xx: List [List[_]]) : List [List[_]] =
xx match {
case aa :: bb :: Nil =>
aa.map (a => bb.map (b => List (a, b))).flatten
case aa :: bb :: cc =>
xproduct (bb :: cc).map (li => aa.map (a => a :: li)).flatten
case _ => xx
}
對於2個解釋它是過度工程。您可以稱爲它
xproduct (List (l, t))
產量可以嵌套,這將導致...
for (i <- 0 to 3) yield {
for (j <- 0 to 2) yield (i,j)
}
在矢量的矢量
:
scala.collection.immutable.IndexedSeq[scala.collection.immutable.IndexedSeq[(Int, Int)]]
= Vector(Vector((0,0), (0,1), (0,2)), Vector((1,0), (1,1), (1,2)), Vector((2,0), (2,1), (2,2)), Vector((3,0), (3,1), (3,2)))
for (i <- 0 to 3;
j <- 0 to 2) yield (i,j)
扁平溶液在語義上是不同的。
問題不清楚。 – 2011-01-08 01:04:18