我在问题中使用scalaz.Heap,我需要提取最大值而不是最小值。
到目前为止我尝试了什么:
使用否定整数 - 丑陋,不正常
在范围内声明implicit val reversedOrder: Order[Int] = Order[Int].reverseOrder
- 无法正常工作
使用这样的结构模仿haskell的newtype
:
implicit class Inverse[T](val restore:T)(implicit order: Order[T])
implicit def inverseOrder[T](implicit ord:Order[T]):Order[Inverse[T]] = new Order[Inverse[T]]{
override def order(x: Inverse[T], y: Inverse[T]): Ordering = ord.order(y.restore,x.restore)
override def equal(x: Inverse[T], y: Inverse[T]): Boolean = ord.equal(x.restore, y.restore)
override def equalIsNatural: Boolean = ord.equalIsNatural
}
太重
直接传递implicits - 不仅意味着每个调用的附加参数,还意味着我的Heap构造函数的Foldable[List]
的其他实例,并使用insert
代替+
- 太沉重了
如何说服scala编译器使用您自己的implicit val
代替提供的,或者该如何正确完成此任务?
UPD : 我在自我回答中描述了一个选项,但有没有可能只为scala中的某个范围指定更多preffered隐式?
答案 0 :(得分:0)
可能的解决方案之一不是导入默认实例。
所以我用import Scalaz._
替换了import Scalaz.{..only needed instances..}
并将我的实例定义改为了
implicit val reversedOrder: Order[Int] = Scalaz.intInstance.reverseOrder