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

问题描述

输入:

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

所需的输出

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

您将如何在Scala中做到这一点?

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

解决方法

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

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

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

,

将猫与列表一起使用:

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))}