1

我刚刚开始从eugene 的博客文章中学习 scalaz 。我试图在我的代码中使用 === 但它返回一个编译错误 value === is not a member of object Red

这是我的代码

import scalaz._

sealed trait TrafficLight
case object Red extends TrafficLight
case object Yellow extends TrafficLight
case object Green extends TrafficLight

object Equality {

import Scalaz._

def eqInstance[A](f: (A,A) => Boolean): Equal[A] = new Equal[A]{
    def equal(a1: A, a2: A): Boolean = f(a1,a2)    
}

def trafficLightEqualFunction(a1: TrafficLight, a2: TrafficLight): Boolean = (a1, a2) match {
    case (Red, Red) => true
    case (Yellow, Yellow) => true
    case (Green, Green) => true
    case _ => false
}

implicit val trafficLightEqual: Equal[TrafficLight] = eqInstance(trafficLightEqualFunction)

def main(args: Array[String]){
    println(Red === Red)
}

}

4

1 回答 1

1

这正是他的博客所抱怨的。的类型RedRed.type并且没有scalaz.Equal这种类型的实例,因为 Equal 是不变的,所以尽管:

Red <: TrafficLight

不跟随

Equal[Red] <: Equal[TrafficLight].

您可以通过使 Scala 将 Red 视为 TrafficLight 来修改它:

println((Red:TrafficLight) === (Red:TrafficLight))
于 2016-07-05T16:04:52.133 回答