Scalaのリストのリストからデカルト積を作成する関数を見つけました。ただし、末尾再帰ではなく、大きなリストではうまく機能しません。残念ながら、設計時に組み合わせる必要のあるリストの数がわからないため、再帰関数が必要だと思います。コンパイラーで最適化できるように、末尾再帰にするのに苦労しています。
def product[T](listOfLists: List[List[T]]): List[List[T]] = listOfLists match {
case Nil => List(List())
case xs :: xss => for (y <- xs; ys <- product(xss)) yield y :: ys
}