【问题标题】:Unable to override implicits in scala无法覆盖scala中的隐式
【发布时间】:2014-03-22 16:44:01
【问题描述】:

我正在尝试学习 scalaz,但对 scala 还是很陌生(现在已经使用了几个月)。我真的很喜欢 scalaz 提供的类型类,并尝试记录 scalaz 中不同功能的不同用例。现在,我对隐含的工作方式和我想做的事情的方式有疑问。

这是我想要工作的代码

import scalaz._
import Scalaz._

object WhatIfIWantfFuzzyMatching extends App {

  implicit object evensEquals extends Equal[Int] {
    override def equal(left: Int, right: Int): Boolean = {
      val leftMod = left % 2
      val rightMod = right % 2
      leftMod == rightMod
    }
  }

  val even = 2
  val odd = 3

  assert(even =/= odd, "Shouldn't have matched!")

  val evenMultTwo = even * 2

  assert(even === evenMultTwo, "Both are even, so should have matched")
}

这个想法很简单。对于代码的某些部分,我想要 scalaz 提供的 Equal[Int] 。在代码的其他部分,我想覆盖 Equal[Int] 提供的不太严格的部分。

现在我遇到了一个问题,即 scala 无法确定使用哪个隐式:

ambiguous implicit values:
both object evensEquals in object WhatIfIWantfFuzzyMatching of type com.gopivotal.scalaz_examples.equal.WhatIfIWantfFuzzyMatching.evensEquals.type
and value intInstance in trait AnyValInstances of type => scalaz.Monoid[Int] with scalaz.Enum[Int] with scalaz.Show[Int]
match expected type scalaz.Equal[Int]
assert(even =/= odd, "Shouldn't have matched!")
     ^

查看此处的其他线程,我看到人们说只是更改类型以免发生冲突,或者仅在需要时导入,但在 scalaz 的 === 以及混合和匹配不同的 equals 方法的情况下,我不知道如何让它与编译器一起工作。

有什么想法吗?

编辑: 这是一个工作示例,可让您在实现之间切换(感谢@alexey-romanov)

object WhatIfIWantToSwitchBack extends App {
  // so what if I want to switch back to the other Equals?
  object modEqualsInt extends Equal[Int] {
    override def equal(left: Int, right: Int): Boolean = {
      val leftMod = left % 2
      val rightMod = right % 2
      leftMod == rightMod
    }
  }

  implicit var intInstance: Equal[Int] = Scalaz.intInstance

  assert(2 =/= 4)

  intInstance = modEqualsInt

  assert(2 === 4)

  intInstance = Scalaz.intInstance

  assert(2 =/= 4)
}

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    您可以只使用相同的名称 intInstance(但这意味着您将失去 MonoidEnumShow 实例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多