微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 重构样板类型约束

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

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

我希望这有点帮助:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐