如何在Scala中推广Future.sequence

如何在Scala中推广Future.sequence,scala,Scala,我试图理解Scala类型系统,并概括了Future.sequence的概念,它的类型为List[Future[T]=>Future[List[T]。我们可以通过定义一个类型为a[B[C]=>B[a[C]的函数来概括这个概念 做这件事最好的方法是什么?我在想下面的事情(注意,我用的名字表明这是一个幺半群,但它不是一个真正的幺半群,尽管它看起来有点类似): 上面的代码段没有编译,因为类型没有一致地约束与mappend和mzero的api一起工作。我如何指定适当的约束以使此代码段可编译,以便我可以正确

我试图理解Scala类型系统,并概括了
Future.sequence
的概念,它的类型为
List[Future[T]=>Future[List[T]
。我们可以通过定义一个类型为
a[B[C]=>B[a[C]
的函数来概括这个概念

做这件事最好的方法是什么?我在想下面的事情(注意,我用的名字表明这是一个幺半群,但它不是一个真正的幺半群,尽管它看起来有点类似):


上面的代码段没有编译,因为类型没有一致地约束与
mappend
mzero
的api一起工作。我如何指定适当的约束以使此代码段可编译,以便我可以正确地定义Future.sequence之类的函数?是否存在更高阶的构造/概念这可以用来(类似于幺半群)避免像我在上面尝试做的那样从头定义可翻转特征?

你实际上是在做一个单子变换。
Future.sequence
没有类型
List[Future[T]=>Future[List[T]]
。它不是一个函数,也不是只在
列表
上运行,而是在任何
可遍历一次
上运行。的确,它通常在
可遍历一次
上运行,但“它不是函数”是什么意思?请看我的答案:您正在寻找
遍历
应用程序
。这有点重复,但这是一个非常好的问题,为什么要投否决票?
trait Flippable[A[B[C]], B[_], C] {
  def mappend(a1: B[A[C]], a2: B[C]): B[A[C]]
  def mzero: B[A[C]]
}