我正在尝试理解Scala类型系统,并概括了Future.sequence
类型为List[Future[T]] => Future[List[T]]
的概念。我们可以尝试通过定义类型A[B[C]] => B[A[C]
的函数来概括这个概念。
最好的方法是什么?我正在考虑下面的内容(请注意,我使用的名称表明这是一个幺半群,但即使看起来有点类似,它也不是真正的幺半群):
trait Flippable[A[B[C]], B[_], C] {
def mappend(a1: B[A[C]], a2: B[C]): B[A[C]]
def mzero: B[A[C]]
}
上面的代码段无法编译,因为类型不一致地限制为使用mappend
和mzero
的api。我如何指定适当的约束来使这个可编译,以便我可以正确地定义像Future.sequence这样的函数?是否存在可以使用的高阶构造/概念(类似于monoid)以避免从头开始定义可翻转特征,正如我上面尝试的那样?