用于Scala中的理解的多个生成器的通用函数

时间:2015-01-07 00:05:37

标签: scala

让我们说我想创建所有可能的字母组合" a"和" b"。对于使用for-comprehensions的长度为2的组合,它将是:

for {
   x <- Seq("a", "b") 
   y <- Seq("a", "b")
} yield x + y

对于长度为3的组合,它将是:

for {
   x <- Seq("a", "b") 
   y <- Seq("a", "b")
   z <- Seq("a", "b")
} yield x + y + z

非常相似。这可以抽象这个模式并编写泛型函数吗? 我能想到这样的签名:

def genericCombine[A,B](length: Int, elements: Seq[A])(reducer: Seq[A] => B): Seq[B]

如何参数化用于理解的生成器数量?

1 个答案:

答案 0 :(得分:4)

这更像是替换而非组合的排列,递归实现相当简单:

def select(n: Int)(input: List[String]): List[String] =
  if (n == 1) input else for {
    c <- input
    s <- select(n - 1)(input)
  } yield c + s

按预期工作:

scala> select(2)(List("a", "b"))
res0: List[String] = List(aa, ab, ba, bb)

scala> select(3)(List("a", "b"))
res1: List[String] = List(aaa, aab, aba, abb, baa, bab, bba, bbb)

(您当然应该检查实际应用程序中的无效输入。)