scala - 在 Scala 特征上定义隐式 View 边界

标签 scala generics types

我正在做一个练习,以在 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]
}

然后,您将被迫在任何具体的子类型中提供它,这证明 AOrdered :
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/

相关文章:

scala - 为什么使用 Foo[T < : Bar] require Foo[_ <: Bar] rather than Foo[_]

scala - scoverageCompile、scoverageTest 排除的区别

java - 为什么有必要在泛型通配符中读取和 super 写入的情况下进行扩展?

java - Java 类型推断是如何工作的?

postgresql - 使用 %TYPE 在 PostgreSQL 中声明复合类型的变量

methods - "too many parameters"完美功能

scala - 为什么 Scala 2.9.1 没有实现 NodeSeq 也是 GenTraversableOnce

c# - 如何通过类扩展延迟初始化泛型 List<T>

java - Collection.add 和 Collection.addAll 中的一些问题

java - mongodb scala 驱动程序 casbah 是否自动管理连接池