16
val cross = (for (x<-setA; y<-setB) yield (x,y))
val cross2 = (setA flatMap (x => setB map ((x,_)))
是否有一種更優雅的方式可以通過跨產品運營商或其他方式做到這一點? E.g:Scala中的2套產品的交叉產品
val cross3 = setA cross setB
val cross = (for (x<-setA; y<-setB) yield (x,y))
val cross2 = (setA flatMap (x => setB map ((x,_)))
是否有一種更優雅的方式可以通過跨產品運營商或其他方式做到這一點? E.g:Scala中的2套產品的交叉產品
val cross3 = setA cross setB
import scala.collection.Set
class
Crossable[E1](es1: Traversable[E1])
{
def
×[E2](es2: Traversable[E2]): Traversable[(E1, E2)] =
for (e1 <- es1; e2 <- es2) yield (e1, e2)
def
cross[E2](es2: Traversable[E2]): Traversable[(E1, E2)] =
for (e1 <- es1; e2 <- es2) yield (e1, e2)
}
object
Crossable
{
implicit
def
trav2Crossable[E1](es1: Traversable[E1]): Crossable[E1] =
new Crossable[E1](es1)
}
object
CrossableTest
{
def
main(args: Array[String]): Unit = {
import Crossable.trav2Crossable
val es1 = Set(1, 2, 3)
val es2 = List("a", "b", "c")
(es1 × es2) foreach(printf(" %s%n", _))
}
}
% scala -cp . CrossableTest
(1,c)
(2,b)
(3,a)
(2,a)
(1,a)
(3,b)
(3,c)
(1,b)
(2,c)
我喜歡,但希望能有內置的標準庫的東西。另外,輸出是在一個有趣的順序?! – adam77 2010-04-29 02:08:20
es1是一個集合,所以結果可能也是一個集合,它使得該集合或多或少是隨機的(當然,它不是隨機的,而是純粹的確定性的,但取決於我們不知道的變量) – 2012-02-06 16:17:29