【问题标题】:Writing a generic Scala merge function, can't get types to line up for compiler编写通用 Scala 合并函数,无法让类型为编译器排队
【发布时间】:2019-03-26 02:55:55
【问题描述】:

我正在尝试使用 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 类型

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    试试

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

    【讨论】:

    • 行得通!不幸的是,现在我可以测试我的代码,但它并没有做正确的事情......但至少现在我可以测试它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多