2016-07-05 42 views
1

我剛剛從eugene's blog post開始學習scalaz。我想在我的代碼使用===但它返回一個編譯錯誤 value === is not a member of object Red使用scalaz's === adt's

這裏是我的代碼

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

}

+0

對我的作品在斯卡拉2.11.7和scalaz 7.1.3,生產:'真'。你使用什麼版本? –

+0

不能讓它爲ScalaZ工作7.2.2 – pedrofurla

回答

1

這正是他的博客中抱怨。該類型的RedRed.type並且對於這種類型的無scalaz.Equal實例,因爲平等是不變的,所以儘管:

Red <: TrafficLight

不遵循

Equal[Red] <: Equal[TrafficLight]

你可以修改,通過使斯卡拉看到紅色的交通燈:

println((Red:TrafficLight) === (Red:TrafficLight)) 
+0

是的......我明白了......通過做'Red.asInstanceOf [TrafficLight] === Red.asInstanceOf [TrafficLight]' 工作,但是,什麼是解決方案?紅色:TrafficLight === Red.TrafficLight'和Red.asInstanceOf [TrafficLight] === Red.asInstanceOf [TrafficLight]'看起來很糟 – xeonzion

+0

我喜歡他在帖子中顯示的解決方案:你有自己的構造函數,比如'val紅色:TrafficLight =紅色。 – pedrofurla