我正在做一个练习,以在 Scala 中实现一个功能性二叉搜索树,遵循我在 Haskell 中看到的类似模式。我有一个看起来像这样的结构:
trait TreeNode[A] {
def isLeaf: Boolean
def traverse: Seq[A]
...
}
case class Branch[A](value: A, left: TreeNode[A], right: TreeNode[A]) extends TreeNode[A] {
def isLeaf: Boolean = false
def traverse: Seq[A] = ...
...
}
case class Leaf[A]() extends TreeNode[A] {
def isLeaf: Boolean = true
def traverse: Seq[A] = Seq[A]()
...
}
我会 喜欢 对
A
施加类型约束这样它就只接受扩展 Ordered
的对象.看起来我需要在 [A <% Ordered[A]]
上的 A ( Branch
) 上定义一个 View 绑定(bind)和 Leaf
,以及 TreeNode
trait.. 我不能在 TreeNode
上这样做trait,但是,因为不接受 View 边界。据我了解,
<%
-style view-bounds 是 implicit
的语法糖。定义,所以应该有一种方法可以在 TreeNode
中手动定义边界。特征。不过,我不确定我应该怎么做。我环顾四周,但没有比需要定义某种隐式更进一步。谁能指出我正确的方向?我是否完全从错误的角度来解决这个问题?
最佳答案
您可以提供 A
的“证据”是 Ordered
通过要求 Ordered[A]
类型的抽象成员在 trait
:
trait TreeNode[A] {
implicit val evidence: Ordered[A]
}
然后,您将被迫在任何具体的子类型中提供它,这证明
A
是 Ordered
:case class Leaf[A](value: A)(implicit ev: Ordered[A]) extends TreeNode[A] {
val evidence = ev
}
您可能想要限制
A
到具有隐式 Ordering[A]
的类型- 这不是继承关系;它更像是一个 haskell 类型类。但是上述技术的实现是相同的。
关于scala - 在 Scala 特征上定义隐式 View 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14483732/