2

我正在尝试编写一个在 Scala 中结合两组列表的函数。第二组中的每个列表都必须附加到第一组中的每个列表以获取所有可能的排列,但是这不起作用,因为 case foo 会导致出现错误,有人知道如何解决这个问题吗?

  type foo = List[bar]
    def combine(s1:Set[foo],s2:Set[foo]):Set[foo] ={
      s1.map{
        case foo => {s2.foreach{
        case foo=> a.append(b)}}
      }.toSet
    }

所以很大程度上我的问题是如何引用地图函数中的列表。

4

3 回答 3

4

如果要附加s1with的所有元素s2。最简单的事情是:

type bar = Int
type foo = List[bar]
def combine(s1:Set[foo], s2:Set[foo]):Set[foo] = for{
x <- s1
y<- s2
} yield x ::: y

val s1 = Set(List(1),List(2))
val s2 = Set(List(3),List(4))
combine(s1,s2)                                 
//> res0: scala.collection.Set[collection.OwnCollection.foo] = Set(List(1, 3), 
                                              //| List(1, 4), List(2, 3), List(2, 4))
于 2013-06-10T08:24:04.233 回答
2

实现此目的的一种方法是使用 flatMap

class Bar
type Foo = List[Bar]
def combine(s1: Set[Foo], s2: Set[Foo]): Set[Foo] = {
  s1.flatMap(a => s2.map(b => a ::: b))
}

请注意,mapandflatMap的语法格式为collection.map(x => transform(x)),因此此处不需要case关键字。

一种更简洁的等效方法是用于理解

def combine(s1:Set[Foo], s2:Set[Foo]): Set[Foo] = 
  for(a <- s1; b <- s2)
    yield a ::: b

有关 Scala 中序列理解的介绍,您可以在这里查看:http ://www.scala-lang.org/node/111

于 2013-06-10T08:42:02.690 回答
0

不理解做你想要的吗?

for{
  a <- s1
  b <- s2
} yield a.append(b)
于 2013-06-10T08:22:02.813 回答