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 = ???
}