我正在尝试学习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)
}
答案 0 :(得分:2)
您可以使用相同的名称intInstance
(但这意味着您将丢失Monoid
,Enum
和Show
个实例。