scalaz.Heap中的逆Int顺序

时间:2015-04-15 13:32:58

标签: scala implicit scalaz

我在问题中使用scalaz.Heap,我需要提取最大值而不是最小值。

到目前为止我尝试了什么:

  1. 使用否定整数 - 丑陋,不正常

  2. 在范围内声明implicit val reversedOrder: Order[Int] = Order[Int].reverseOrder - 无法正常工作

  3. 使用这样的结构模仿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
    }
    

    太重

  4. 直接传递implicits - 不仅意味着每个调用的附加参数,还意味着我的Heap构造函数的Foldable[List]的其他实例,并使用insert代替+ - 太沉重了

  5. 如何说服scala编译器使用您自己的implicit val代替提供的,或者该如何正确完成此任务?

    UPD : 我在自我回答中描述了一个选项,但有没有可能只为scala中的某个范围指定更多preffered隐式?

1 个答案:

答案 0 :(得分:0)

可能的解决方案之一不是导入默认实例。

所以我用import Scalaz._替换了import Scalaz.{..only needed instances..} 并将我的实例定义改为了 implicit val reversedOrder: Order[Int] = Scalaz.intInstance.reverseOrder