5

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

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
  }
}
4

2 回答 2

3

不幸的是,您不能将类型声明为type U[T] = T <% Ordered[T]. 这将不起作用,甚至无法编译。

但是,您可以将一些解决方法应用于您的代码

相信这个思维流程:

如此处所述:

def f[A <% B](a: A) = a.bMethod

是相同的

def f[A](a: A)(implicit ev: A => B) = a.bMethod

和这个

def g[A : B](a: A) = h(a)

是相同的

def g[A](a: A)(implicit 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

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

  def qsort = ???

  def partition = ???

  def qselect = ???
}

我希望这会有所帮助:)

于 2013-10-09T09:39:22.053 回答
1

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

于 2013-10-09T04:23:25.830 回答