2016-11-20 4 views
1

그래서 나는 정의 스칼라의 다형성 데이터 유형 트리유형 클래스

sealed trait Tree[+A] 
final case class Node[A](value: A) extends Tree[A] 
final case class Branch[A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A] 

object Tree{ 

    implicit def eqTree[T]: Eq[Tree[T]] = new Eq[Tree[T]] { 
    override def ==(t1: Tree[T], t2: Tree[T]): Boolean = true 
    } 
} 

그리고

trait Eq[T]{ 

    def == (t1: T, t2: T) : Boolean 
} 

그리고 내가

을하려고 식 타입 클래스를 다음과했다
object App1 extends App{ 

    import Tree._ 

    def equality[T](t1: T, t2: T)(implicit eq: Eq[T]): Boolean = eq.==(t1, t2) 

    println(equality(Node(1), Node(2))) 
} 

그러나 나는 다음과 같은 오류를 얻을

Error:(35, 19) could not find implicit value for parameter eq: typeclasses.Eq[typeclasses.Node[Int]] 
    println(equality(Node(1), Node(2))) 
+0

경우'T1'와'T2'이 선언되고

그래서 기본적으로이 컴파일러는보고 무엇인가? – pedrofurla

답변

4

오류 메시지에 따르면 컴파일러는 Eq[Node[Int]]을 찾으려고 시도하고 있으며 범위에 해당 값이 없습니다. Eq[Tree[T]]을 정의했습니다.

equality[Node[Int]](Node(1), Node(2)) 

그러나 실제로이 원하는을 :

println(equality[Tree[Int]](Node(1), Node(2))) 
+0

당신의 관찰이 틀렸다고 말하는 것은 아니지만 그의 코드를 그대로 컴파일한다고 생각하지 않습니다. T1과 T2에주의하십시오. – pedrofurla

+0

또 다른 고려해야 할 것은'=='이며 모든 객체에 이미 정의되어 있습니다. (정의 문법은'=='에서'equals'까지의 문법 설탕이기 때문에 여기서는 좋은 단어가 아닙니다.) – pedrofurla

+0

저는 haskell이 scala에서 작동하는 typecl과 동등한 지 알아보기 위해 노력하고 있습니다. 나는 == –