Scala 重构样板文件类型约束

Scala 重构样板文件类型约束,scala,Scala,我有一个对象,它有一系列相关的例程,它们的声明看起来都一样,比如 object Sorting { def qsort[a <% Ordered[a]] .... def partition[a <% Ordered[a]] ... def qselect[a <% Ordered[a]] ... } 如中所述,不使用别名。该视图绑定实际上为这些方法中的每一个都添加了一个隐式参数,这不容易抽象为类型别名 不幸的是,您不能将type声明为typeu[T]=T。它

我有一个对象,它有一系列相关的例程,它们的声明看起来都一样,比如

object Sorting {
  def qsort[a <% Ordered[a]] ....

  def partition[a <% Ordered[a]] ...

  def qselect[a <% Ordered[a]] ...
}

如中所述,不使用别名。该视图绑定实际上为这些方法中的每一个都添加了一个隐式参数,这不容易抽象为类型别名

不幸的是,您不能将type声明为
typeu[T]=T。它似乎可以很好地处理object,但我应该如何使用trait?使用
object IntSorting扩展某些对象会扩展排序[Int]
这有点违背目的。@Synapse,您也可以使用pimp my library方法,但是您必须使用trait中类似的方法创建隐式包装器:
implicit def toPimp[A](xs:Stream[A])=新的{def qsort[A](xs:Stream[A])=新的排序[A](xs Stream[A]){…}.sort(xs)}
然后您可以使用它
xs.sort
。他还可以使用
排序
而不是
排序
,这样就不需要视图绑定。
object Implicits {
  implicit class SortableArray[a <% Ordered[a]](xs: Array[a]) {
    def qsort = {...}
  }
}

object Application {
  import Implicits._
  def main(args: Array[String]) = {
    val xs = Array(1,2,3)
    xs.qsort
  }
}
def qsort[A <% Ordered[A]] = ???
def qsort[A](implicit ev: A => Ordered[A]) = ???
type O[A] = A => Ordered[A]
def gsort[A] (implicit ev: O[A])
def gsortX[A : O]
object Sorting {

  def qsort[A <% Ordered[A]] = ???

  def partition[A <% Ordered[A]] = ???

  def qselect[A <% Ordered[A]] = ???
}
object Sorting {

  type O[A] = A => Ordered[A]

  def qsort[A: O] = ???

  def partition[A: O] = ???

  def qselect[A: O] = ???
}
trait Sorting[A] {
  type O = A => Ordered[A]
  implicit def f : O

  def qsort = ???

  def partition = ???

  def qselect = ???
}