2

Scala で 2 セットのリストを結合する関数を作成しようとしています。2番目のセットの各リストを最初のセットの各リストに追加して、可能なすべての順列を取得する必要がありますが、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

これを実現する 1 つの方法は、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))
}

mapandの構文flatMapは の形式であるため、ここではキーワード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 に答える