scala中任意数量列表的交叉乘积

dip*_*ips 5 scala

我在Scala中有一个列表列表如下.

val inputList:List[List[Int]] = List(List(1, 2), List(3, 4, 5), List(1, 9))
Run Code Online (Sandbox Code Playgroud)

我想要一个所有子列表的交叉产品列表.

val desiredOutput: List[List[Int]] = List( 
        List(1, 3, 1), List(1, 3, 9),
        List(1, 4, 1), List(1, 4, 9),
        List(1, 5, 1), List(1, 5, 9),
        List(2, 3, 1), List(2, 3, 9),
        List(2, 4, 1), List(2, 4, 9),
        List(2, 5, 1), List(2, 5, 9))
Run Code Online (Sandbox Code Playgroud)

inputList中的元素数量以及子列表都不固定.Scala的做法是什么?

xie*_*fei 4

如果您使用scalaz,这可能适合以下情况Applicative Builder

import scalaz._
import Scalaz._

def desiredOutput(input: List[List[Int]]) = 
  input.foldLeft(List(List.empty[Int]))((l, r) => (l |@| r)(_ :+ _))

desiredOutput(List(List(1, 2), List(3, 4, 5), List(1, 9)))
Run Code Online (Sandbox Code Playgroud)

我自己对 scalaz 不是很熟悉,我希望它有一些更强大的魔力来做到这一点。

编辑

正如特拉维斯·布朗(Travis Brown)建议的那样,我们只是写

def desiredOutput(input: List[List[Int]]) = input.sequence
Run Code Online (Sandbox Code Playgroud)

我发现这个问题的答案对于理解它的sequence作用非常有帮助。