为 Scala 中的多态数据类型键入 类
Type classes for polymorphic data types in scala
所以我在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
}
}
还有一个类型class 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)))
如错误所述,编译器正在尝试查找 Eq[Node[Int]]
,但范围内没有这样的值。您已定义 Eq[Tree[T]]
.
所以基本上这就是编译器看到的:
equality[Node[Int]](Node(1), Node(2))
但你真的想要这个:
println(equality[Tree[Int]](Node(1), Node(2)))
所以我在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
}
}
还有一个类型class 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)))
如错误所述,编译器正在尝试查找 Eq[Node[Int]]
,但范围内没有这样的值。您已定义 Eq[Tree[T]]
.
所以基本上这就是编译器看到的:
equality[Node[Int]](Node(1), Node(2))
但你真的想要这个:
println(equality[Tree[Int]](Node(1), Node(2)))