2つのリストのすべてのペアワイズの組み合わせを含むタプルを含むコレクションを作成したいと思います。何かのようなもの:
for ( x <- xs )
for ( y <- ys )
yield (x,y)
Pythonではこれは機能しますが、Scalaでは明らかfor
に最後のループのみが生成されます(したがって、これは次のように評価されますUnit
)
Scalaでそれを実装する最もクリーンな方法は何ですか?
2つのリストのすべてのペアワイズの組み合わせを含むタプルを含むコレクションを作成したいと思います。何かのようなもの:
for ( x <- xs )
for ( y <- ys )
yield (x,y)
Pythonではこれは機能しますが、Scalaでは明らかfor
に最後のループのみが生成されます(したがって、これは次のように評価されますUnit
)
Scalaでそれを実装する最もクリーンな方法は何ですか?
あなたはほとんどそこにいました:
scala> val xs = List (1,2,3)
xs: List[Int] = List(1, 2, 3)
scala> val ys = List (4,5,6)
ys: List[Int] = List(4, 5, 6)
scala> for (x <- xs; y <- ys) yield (x,y)
res3: List[(Int, Int)] = List((1,4), (1,5), (1,6), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6))
Nicolas によると、もう少し明示的に:
Scala では、1 つの for-comprehension で複数のジェネレーターを使用できます。
val xs = List(1,2,3)
val ys = List(4,5)
for {
x <- xs
y <- ys
} yield (x,y)
res0: List[(Int, Int)] = List((1,4), (1,5), (2,4), (2,5), (3,4), (3,5))
理解度で評価することもできます。
for {
x <- xs
y <- ys
if (x + y == 6)
} yield (x,y)
res1: List[(Int, Int)] = List((1,5), (2,4))
または、課題を作成します。
for {
x <- xs
y <- ys
val z = x + y
} yield (x,y,z)
res2: List[(Int,Int,Int)] = List((1,4,5), (1,5,6), (2,4,6), (2,5,7), (3,4,7), (3,5,8))