【问题标题】:Scala comparing type:OrderingScala比较类型:排序
【发布时间】:2014-10-13 18:58:27
【问题描述】:

我有一个这样的排序功能:

def sort[A:Ordering](vals: Array[A]):Array[A] = {
for (i <- 1 until vals.length) {
  val temp = vals(i)
  var j = i
  while (j > 0 && temp < vals(j-1) ){
    vals(j) = vals(j-1)
    j -= 1
  }
  vals(j) = temp;
}
vals

}

它应该获取一个类型为 A 的数组(它是 Int 或 String,但代码不知道)作为参数并对其进行排序然后返回它。 现在eclipse告诉我:

“值

在第 5 行。我不明白为什么它不能比较这些值,我试过 A:Comparable、A:Ordered 和 A:every-word-that-c​​ould-possibly-work。没有任何效果。

感谢任何帮助!
谢谢!

【问题讨论】:

    标签: scala types compare


    【解决方案1】:

    [A:Ordering] 在函数sort 上意味着应该存在这样的隐含值(老实说,它可能不是隐含的,但在这种情况下你必须手动传递它),即在sort 调用时具有Ordering[A] 类型,并且此隐式值将添加到函数的单独参数列表中

    这就是 Scala 支持 typeclasses 的方式。

    这不会神奇地将&lt; 添加到A,因为A 上没有类型绑定,并且编译器无法知道AAny 的子类型。

    无论如何,要在sort 的正文中使用排序,您可以使用以下方式获取它:

    implicitly[Ordering[A]]
    

    ... 然后使用它。这是因为,Ordering[A] 类型的隐式值再次被添加到 sort 的额外参数列表中。

    这是一个代码 sn-p,它可以让您了解如何在代码中使用它:

    scala> def lt[T : Ordering](a: T, b: T) = { implicitly[Ordering[T]].lt(a, b) }
    lt: [T](a: T, b: T)(implicit evidence$1: Ordering[T])Boolean
    
    scala> lt(1, 1)
    res9: Boolean = false
    
    scala> lt(1, 2)
    res10: Boolean = true
    

    【讨论】:

    • 非常感谢!我永远不会想到这样的事情!现在在我的代码的其他部分我有这个: var arr = Array.ofDim[A](size) 它说“A 没有可用的 ClassTag”。这和上面的解决方案有关系吗?
    • @OuTsei 这是另一个问题。在ClassTags 上的 Google 信息以及如何在 Scala 中处理类型擦除。
    • 我仍然无法让它工作。在其他失败中,我尝试了这个: var arr = Array.ofDim[Ordering[A]](size) 和 eclipse 似乎可以接受,但它的类型错误。 arr 应该是 Array[A]
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多