Scala A=>;中没有可用的隐式视图;使用默认值时已订购[A]

Scala A=>;中没有可用的隐式视图;使用默认值时已订购[A],scala,view,binary-search-tree,implicit,Scala,View,Binary Search Tree,Implicit,我正在Scala中实现简单的BST(基于泛型)。我已经实现了抽象类: abstract class MyTree[A <% Ordered[A]]() ..... 抽象类MyTree[A如果没有实际代码,很难评估隐式函数A=>Ordered[A]在哪一点缺失 但无论如何,我建议不要使用到Ordered[a]的转换,而是使用单个类型类Ordered[a]。使用它,您不需要实际转换元素类型,但您有一个提供排序操作的实例。我想不出哪种情况下我更喜欢排序而不是排序 我还建议不要在抽象类型中使用构

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

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

抽象类MyTree[A如果没有实际代码,很难评估隐式函数
A=>Ordered[A]
在哪一点缺失

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

我还建议不要在抽象类型中使用构造函数参数(
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]{
def包含(x:A):布尔值
}
案例类叶[A](v:A)扩展了MyTree[A]{
def包含(x:A):布尔=x==v
}
案例对象为空扩展MyTree[任何]{
def包含(x:Any):布尔值=false
}
案例类节点[A](v:A,左:MyTree[A],右:MyTree[A])
(隐式val排序:排序[A])
扩展我的树[A]{
def包含(x:A):布尔=x==v | |{
import Ordering.Implicits.//nice运算符语法
(如果(x

(在这里,
MyTree
类型中的反向变量
-A
允许将
定义为单个case对象,但您也可以使用不变量
A

谢谢您的建议!我将Ordered改为Ordering,一切都很完美。
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