列表中列表之间的笛卡尔积

Cartesian product between list inside a list

输入:

[[a,b,c],
[d,e,],
[f,g,h]
]

期望的输出:

[
[a,d,f],[a,d,g],[a,d,h],.......[c,e,h]
].

你会如何在 Scala 中做到这一点?

编辑:包含每个字母的单个列表的大小以及包含该列表的列表的大小是随机的。包含字母的列表可以有不同的大小

将猫与列表一起使用:

import cats.Semigroupal
import cats.instances.list._

Semigroupal[List]
  .product(Semigroupal[List]
    .product(List("a","b","c"), List("d","e","")),(List("f","g","h")))
  .flatten {case ((a,b), c) => List((a,b,c))}

这对于元素类型是通用的,但对于集合类型是特定的,即 List

def cProd[T](in: List[List[T]]): List[List[T]] =
  in.foldRight(List(List.empty[T])) {
    for {word <- _ ; sentence <- _} yield word :: sentence
  }

它可以针对集合类型变得更通用,但您可能会失去一些 List 优化。