2

各シーケンスが理解表現に使用されるシーケンスのリストを受け入れる関数を書きたいと思います。

例えば。

for (x <- (1 to 10); y <- (1 to 10)) yield List(x,y)

上記の式では、x と y の組み合わせが必要であることを事前に知っておく必要があります。x、y、z ...などの組み合わせ (未知数の組み合わせ) が必要な場合はどうすればよいですか? 10個の組み合わせが必要な場合は、10個のスニペット「x <- (1 to 10)」を式に貼り付けます。Clojureのマクロ(コードを貼り付ける方法)でこれを行うことができると思います。Scalaでこれを行うにはどうすればよいですか?

私が書きたい関数には、次のような署名があります。

combine(list: List[List[Int]])

関数の本体は、リスト内の各項目を使用して、理解のために貼り付けます。

私の意図を理解していただければ幸いです。

4

2 に答える 2

2

リストのリストのデカルト積を計算したい場合は、 map と flatMap の呼び出しを再帰的に連鎖させることで実行できます。とにかく、それは式が行うことです。

  def prod(l:List[List[Int]]):List[List[Int]] = l match {
    case Nil => List(Nil)
    case l::ls => l.flatMap(i => prod(ls).map(t =>i::t))
  }
于 2012-09-23T16:20:17.557 に答える
1

あなたは2つのものを1つのものに組み合わせる方法を知っていて、任意の数を組み合わせたいので、それはあなたが必要であることを意味しますfold。唯一の変更は、アイテムのリストではなく、シングルトンのリストから始めたいということです。

val xss = List(List(1,2,3),List(4,5),List(6,7))
val singletons = xss.head.map(x => List(x))   // List(List(1), ...)
val seqs = (singletons /: xss.tail){ (yss, xs) => for (ys <- yss; x <- xs) yield x :: ys }
seqs.map(_.reverse)

最終段階で印刷されます

List(List(1, 4, 6), List(1, 4, 7), List(1, 5, 6),
     List(1, 5, 7), List(2, 4, 6), List(2, 4, 7),
     List(2, 5, 6), List(2, 5, 7), List(3, 4, 6),
     List(3, 4, 7), List(3, 5, 6), List(3, 5, 7))
于 2012-09-23T16:27:53.503 に答える