【问题标题】:Type aliasing ordered generics in ScalaScala中的类型别名有序泛型
【发布时间】:2013-03-18 07:53:19
【问题描述】:

我对二叉树应该是什么样子有一个最小的定义:

type Tree[T] = Option[Node[T]]
case class Node[T](left: Tree[T], entry: T, right: Tree[T])

我现在想将二叉搜索树定义为:

type BST[T: Ordering] = Tree[T] 

但这不会编译。我做错了什么?

【问题讨论】:

    标签: scala generics comparable type-alias


    【解决方案1】:

    你得到的编译错误基本上是说 context bounds 不能用于类型别名。上下文边界确实在函数或类定义中起作用。例如,

    class BST[T: Ordering](val tree: Tree[T])
    

    实际上是

    的简写符号
    class BST[T](val tree: Tree[T])(implicit ordering: Ordering[T])
    

    请注意,不同的BST 对象可能有不同的Orderings,这些值必须在运行时存储。

    对于您的用例,最简单的方法可能是将上下文绑定到您想到的通用函数上,

    def f[T: Ordering](t1: Tree[T], t2: Tree[T]) {
      import scala.math.Ordering.Implicits._
      t1.get.entry < t2.get.entry
    }
    

    然后会在f的调用点找到适当的Ordering[T]隐式,其中T的类型是已知的。

    【讨论】:

    • 你的意思是“简写符号:class BST[T](val tree: Tree[T])(implicit ordering: Ordering[T])
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 2015-07-09
    • 2020-03-27
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多