编写通用的 Scala 合并函数,无法获取要排队用于编译器的类型



我正在尝试用Scala学习FP。我在一个对象上有一个函数来合并两个排序的集合并返回相同的类型。它看起来像这样:

@tailrec def merge[A, Repr <: Seq[A]](merged: Repr, l1: Repr, l2: Repr)(
  implicit ordering: Ordering[A]): Repr = {
if (l1.isEmpty) merged ++ l2
else if (l2.isEmpty) merged ++ l1
else {
  val l1Head: A = l1.head
  val l2Head = l2.head
  val orderVal = ordering.compare(l1Head, l2Head)
  if (orderVal <= 0) {
    val m2: Repr = l1Head +: merged
    merge[A, Repr](m2, l1.tail, l2)
  } else {
    merge[A, Repr](l2Head +: merged, l1, l2.tail)
  }
 }
}

它给了我编译器错误"Seq[A] 类型的表达式不符合预期的类型 Repr

尝试

@tailrec def merge[A, Repr](merged: Repr, l1: Repr, l2: Repr)(implicit
  ev: Repr => SeqLike[A, Repr],
  cbf: CanBuildFrom[Repr, A, Repr],
  ordering: Ordering[A]
): Repr = {
  if (l1.isEmpty) merged ++ l2
  else if (l2.isEmpty) merged ++ l1
  else {
    val l1Head: A = l1.head
    val l2Head = l2.head
    val orderVal = ordering.compare(l1Head, l2Head)
    if (orderVal <= 0) {
      val m2: Repr = l1Head +: merged
      merge[A, Repr](m2, l1.tail, l2)
    } else {
      merge[A, Repr](l2Head +: merged, l1, l2.tail)
    }
  }
}

最新更新