我有一个带有一堆相关例程的对象,它们的所有声明看起来都是一样的
object Sorting { def qsort[a <% Ordered[a]] .... def partition[a <% Ordered[a]] ... def qselect[a <% Ordered[a]] ... }
有没有办法在一个地方指定类型约束,并将声明减少到像qsort [a](xs:Stream [a])或更好的只是qsort(xs:Stream [a])?
暂时我决定使用隐式类进行滚动
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 } }
解决方法
不幸的是,你不能将类型声明为类型U [T] = T<%Ordered [T].这不起作用,甚至不会编译. 但是,您可以将一些解决方法应用于您的代码 设想这个思维流程: 如
here所述:
def f [A<%B](a:A)= a.bMethod 是相同的 def f [A](a:A)(隐式ev:A => B)= a.bMethod
还有这个
def g [A:B](a:A)= h(a)
是相同的
def g [A](a:A)(隐式ev:B [A])= h(a)
.
所以回到你的例子:
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 = ??? }
我希望这有点帮助:)