【问题标题】:No implicit view avaliable from A => Ordered[A] while using default values使用默认值时,A => Ordered[A] 没有可用的隐式视图
【发布时间】:2015-08-27 19:37:16
【问题描述】:

我正在 Scala 中实现简单的 BST(基于泛型)。我已经实现了抽象类:

abstract class MyTree[A <% Ordered[A]]() .....

还有子类Node

case class Node[A <% Ordered[A]](v: A, left: MyTree[A] = Leaf[A], right: MyTree[A] = Leaf[A]) extends MyTree[A] .....

还有一个 Leaf 案例类,它代表我的树的空 Leaf。我想这没关系,所以我不会在这里发布它的代码。 问题是我得到一个错误:

A => Ordered[A] 没有可用的隐式视图。 case class Node[A

当我将

【问题讨论】:

    标签: scala view binary-search-tree implicit


    【解决方案1】:

    如果没有实际代码,很难评估您的隐式函数 A =&gt; Ordered[A] 丢失的位置。

    但无论如何我都建议不要使用转换为Ordered[A],而是使用单个类型类Ordering[A]。使用它,您不需要实际转换元素类型,但您有一个提供排序操作的实例。我想不出我更喜欢Ordered 而不是Ordering

    我还建议不要使用抽象类型的构造函数参数(在您的情况下为MyTree)。最好定义一个抽象成员。例如:

    sealed trait MyTree[-A] {
      def contains(x: A): Boolean
    }
    
    case class Leaf[A](v: A) extends MyTree[A] {
      def contains(x: A): Boolean = x == v
    }
    
    case object Empty extends MyTree[Any] {
      def contains(x: Any): Boolean = false
    }
    
    case class Node[A](v: A, left: MyTree[A], right: MyTree[A])
                      (implicit val ordering: Ordering[A])
      extends MyTree[A] {
    
      def contains(x: A): Boolean = x == v || {
        import Ordering.Implicits._   // nice operator syntax
        (if (x < v) left else right).contains(x)
      }
    }
    
    val t = Node(5, Node(3, Leaf(1), Empty), Leaf(8))
    (0 to 9).map(t.contains) // F T F T F T F F T F
    

    (这里MyTree 类型中的逆变器-A 允许将Empty 定义为单个案例对象,但您也可以坚持不变的A

    【讨论】:

    • 感谢您的建议!我将 Ordered 更改为 Ordering,一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多