无法覆盖scala中的隐式

无法覆盖scala中的隐式,scala,scalaz,Scala,Scalaz,我正在尝试学习scalaz,但对scala还是很陌生(已经使用了几个月了)。我非常喜欢scalaz提供的类型类,并尝试记录scalaz中不同功能的不同用例。现在我对IMPLITS的工作方式和我想做的事情的方式有意见 这是我想要的代码 import scalaz._ import Scalaz._ object WhatIfIWantfFuzzyMatching extends App { implicit object evensEquals extends Equal[Int] {

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

这是我想要的代码

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提供相等的[Int]。在代码的其他部分中,我想用一个不太严格的[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)


您可以使用相同的名称
intInstance
(但这意味着您将丢失
Monoid
Enum
Show
实例)

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)
}