在scala中键入多态数据类型的类

时间:2016-11-20 17:31:57

标签: scala polymorphism typeclass implicit

所以我在scala中有一个多态数据类型Tree,定义如下

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

一个类型Eq

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

1 个答案:

答案 0 :(得分:4)

正如错误所述,编译器正在尝试查找Eq[Node[Int]],并且范围内没有此类值。您已定义Eq[Tree[T]]

所以基本上这就是编译器所看到的:

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

但你真的想要这个:

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