类型类多态数据类型
所以我在斯卡拉多态数据类型树定义如下类型类多态数据类型
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)))
由于错误提示,编译器试图找到Eq[Node[Int]]
,并且范围中没有这样的值。您已定义Eq[Tree[T]]
。
所以基本上这是编译器看到的是:
equality[Node[Int]](Node(1), Node(2))
但你真的想这样:
println(equality[Tree[Int]](Node(1), Node(2)))
不是说你的观察是错误的,但我不认为他的代码甚至可以编译。注意T1和T2。 – pedrofurla
要考虑的另一件事是'==',它已经为每个对象定义。 (在这里定义不是一个好词,因为它只是从'=='到'equals'的语法糖) – pedrofurla
我只是想看看我能否让haskell等价于在scala中工作的类型类。我知道我可以使用== –
哪里'T1'和'T2'申报? – pedrofurla