【问题标题】:Inverse Int Order in scalaz.Heapscalaz.Heap 中的 Int 逆序
【发布时间】:2015-06-21 11:59:05
【问题描述】:

我在需要提取最大值而不是最小值的问题中使用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 - 不仅意味着每次调用的附加参数,还意味着Foldable[List] 的附加实例到我的堆构造函数并使用insert 而不是+ - 太重了强>

如何说服 scala 编译器使用您自己的 implicit val 而不是提供的,或者应该如何正确完成这项任务?

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

【问题讨论】:

  • 如果需要,可以显式传递隐式参数。
  • @Lee,是的,我忘记了这是我尝试过的另一件沉重的事情

标签: scala implicit scalaz


【解决方案1】:

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

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

【讨论】:

  • 这会让你很快陷入麻烦(就像你或其他人第一次在默认实例的上下文中使用insert)。使用 newtype 样式的包装器可能会更好,并且没有问题所暗示的那么糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2018-02-20
  • 2015-12-08
  • 1970-01-01
相关资源
最近更新 更多