2016-07-05 10 views
1

나는 방금 eugene's blog post에서 스카프를 배우기 시작했습니다. 내 코드에서 ===를 사용하는 것을 시도하고 있지만 여기에 컴파일 오류를 value === is not a member of object Red스카 쯔의 사용 === adt의

을 반환 것은 내 코드

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에 생산 :

당신은 만들어 스칼라 TrafficLight로 레드를 볼 수 있음을 수정할 수 있습니다 'TRUE'를. 어떤 버전을 사용하고 있습니까? –

+0

ScalaZ 7.2.2에서 작동하지 않을 수 있습니다. – pedrofurla

답변

1

입니다. Red의 유형은 Red.type하고 평등은 불변이기 때문에에도 불구하고 있으므로 이러한 유형의 scalaz.Equal의 어떤 인스턴스가 없습니다 : 그것은

Equal[Red] <: Equal[TrafficLight]을 따르지 않는

Red <: TrafficLight

. 나를 위해

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

예 ... 알았습니다. 'Red.asInstanceOf [TrafficLight] === Red.asInstanceOf [TrafficLight]' 해결책? 'Red : TrafficLight === Red.TrafficLight'과'Red.asInstanceOf [TrafficLight] === Red.asInstanceOf [TrafficLight]'는 나쁘다. – xeonzion

+0

나는 그가 게시물에서 보여주는 해결책을 좋아한다. 당신이'val 적색 : TrafficLight = 빨강'. – pedrofurla