【发布时间】:2015-06-21 11:59:05
【问题描述】:
我在需要提取最大值而不是最小值的问题中使用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 - 不仅意味着每次调用的附加参数,还意味着
Foldable[List]的附加实例到我的堆构造函数并使用insert而不是+- 太重了强>
如何说服 scala 编译器使用您自己的 implicit val 而不是提供的,或者应该如何正确完成这项任务?
UPD: 我在自我回答中描述了一个选项,但是是否有可能只为 scala 中的某些范围指定更多首选隐式?
【问题讨论】:
-
如果需要,可以显式传递隐式参数。
-
@Lee,是的,我忘记了这是我尝试过的另一件沉重的事情