隐参数分辨率赋予多重类型参数(Implicit parameter resolution given

2019-10-19 21:30发布

我使用的需要及其类型的一个类型的类A有Scalaz的实例Order[A] 在我的使用情况, A是一个Java类-尤其约达时间的LocalDate 。 这个类有一个自然排序,因为它实现了Comparable

我无法找到一个Order例如Comparable在Scalaz本身S,所以我试着写一个自己:

implicit def comparableOrder[A, B]
  (implicit ev0: <:<[A, B],
            ev1: <:<[A, Comparable[B]]): Order[A] = new Order[A] {
  override def order(x: A, y: A): Ordering = Ordering.fromInt(x.compareTo(y))
}

然而,即使把这个定义为范围后,下面几行编译失败:

implicitly[Order[LocalDate]]
implicitly[Order[LocalDate <:< Comparable[LocalDate]]]

但是,下列情况:

implicitly[Order[LocalDate <:< Comparable[ReadablePartial]]]

至于后,我硬编码包含一个隐含的VAL做以下Order情况我在寻找:

implicit val localDateOrder = comparableOrder[LocalDate, ReadablePartial]
implicitly[Order[LocalDate]]

有没有一种方法,我可以得到Scala编译器来自动拾取这种情况? 隐式VAL工作在这种情况下,但很快就变得笨重与嵌套结构。 我使用Scala的2.10.4。

编辑:我也试着测试这个在A实现小号Comparable[A]而非Comparable[B]其中B是一个超A 。 它似乎仍然没有工作:

class MyInt(n: Int) extends Comparable[Int] {
  override def compareTo(o: Int): Int = n - o
}
implicit def comparableOrder[A <: Comparable[A]]: Order[A] = new Order[A] {
  override def order(x: A, y: A): Ordering = Ordering.fromInt(x.compareTo(y))
}
implicitly[Order[MyInt]]
文章来源: Implicit parameter resolution given multiple type parameters