【发布时间】:2019-05-25 08:43:46
【问题描述】:
在Scala methods and higher-kinded type parameters 中的问答之后,我询问了如何创建具有更高种类参数的方法,以便我可以使用任何 Seq,我现在在使用 .zip 方法时遇到了一个奇怪的问题。下面的代码无法编译,complire 报告:
Error:(18, 28) type mismatch;
found : Seq[X]
required: S[X]
itrA.zip(itrB).map {
我不知道 S[X] 在哪里转换为 Seq[X]。但是,如果我将调用 .zip 的代码替换为更简单的代码(已注释的代码),它简单地将 itrA 和 itrB 的两个头相加并返回 ItrA,则编译成功。
代码是:
object SeqOps {
def sum[X: Numeric, S[Y] <: Seq[Y]](s: Seq[S[X]])
(implicit cbf: CanBuildFrom[Nothing, X, S[X]]): Seq[X] =
/*
This code compiles
s.reduce{(itrA, itrB) =>
val num = implicitly[Numeric[X]]
val sum = new num.Ops(itrA.head).+(itrB.head)
itrA
*/
s.reduce{(itrA, itrB) =>
itrA.zip(itrB).map { // it seems that itrB loses the type here :/
case (a, b) =>
val num = implicitly[Numeric[X]]
val sum = new num.Ops(a).+(b)
sum
}
}
def main(args: Array[String]): Unit = {
sum(Seq(Vector(1), Vector(1)))
}
}
问题是:为什么会这样?我该如何解决?
【问题讨论】:
标签: scala collections higher-kinded-types