类型类多态数据类型

问题描述:

所以我在斯卡拉多态数据类型树定义如下类型类多态数据类型

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

哪里'T1'和'T2'申报? – pedrofurla

由于错误提示,编译器试图找到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中工作的类型类。我知道我可以使用== –