gpt4 book ai didi

scala - 类型参数化或结构子类型化或

转载 作者:行者123 更新时间:2023-12-04 14:05:12 25 4
gpt4 key购买 nike

再会!
我对 scala 很陌生,所以在开发过程中提出了以下问题:

我要描述类树[T] , 其中 电话 是类型参数。
但是 T 应该受到限制 - 它应该有两种方法:
def key(): A , 其中 一个 是某种类型,派生自方法的实现(!)
def union(x: T): T , 其中 电话 与类型参数相同。
我想这个约束可以用几种方式表达:

  • 定义两个特征,一个使用方法 关键 和其他方法 工会 (两个特点是因为这些方法的独立性)
  • 使用结构子类型
  • 别的...

  • 那么我该如何以各种方式做到这一点?还有其他方法吗?

    如果可以很容易地为简单类型(如 String、Int 等)添加这些方法,那就太好了。

    最佳答案

    您可以为 key 定义结构类型,但不适用于 union .结构类型可能不引用在其外部定义的抽象类型。所以这行不通:

    trait Tree[T <: { def union(x: T): T }]

    您可以定义 Tree 的元素的特征。但必须提供:
    trait TreeVal[T] {
    type A
    def key: A
    def union(x: T): T
    }

    这可以通过两种方式使用。首先,类必须实现该接口(interface),这严重限制了哪些类可以用作键。这将是这样的:
    trait Tree[T <: TreeVal[T]]

    它也可以作为隐式转换提供,如下所示:
    class IntVal(v: Int) extends TreeVal[Int] {
    type A = Int
    def key: A = v
    def union(x: Int): Int = x + v
    }
    implicit def IntIsVal(v: Int): IntVal = new IntVal(v)

    class Tree[T <% TreeVal[T]] // must be class, so it can receive parameters

    这使用了所谓的 View 绑定(bind)。查找更多信息,但足以说明您将能够处理任何定义了隐式转换并在范围内的东西,就好像它是 TreeVal .例如:
    class Tree[T <% TreeVal[T]](node: T, left: Option[Tree[T]], right: Option[Tree[T]]) {
    override def toString = "(%s < %s > %s)" format (left.getOrElse("o"), node.key, right.getOrElse("o"))
    }

    或者,您可以将它与类型类模式一起使用,并进行一些更改:
    trait TreeVal[T] {
    type A
    def key(v: T): A
    def union(x: T, y: T): T
    }
    class Tree[T : TreeVal] // must be class, so it can receive parameters

    类型类模式使用上下文边界。查找更多信息。如今,这种风格通常比以前的风格更受欢迎,因为它在许多方面都更加灵活。尽管如此,两者都会起作用。

    在这种情况下,人们会像这样使用它:
    implicit object IntVal extends TreeVal[Int] {
    type A = Int
    def key(v: Int) = v
    def union(x: Int, y: Int) = x + y
    }

    class Tree[T: TreeVal](node: T, left: Option[Tree[T]], right: Option[Tree[T]]) {
    val treeVal = implicitly[TreeVal[T]]
    import treeVal._

    override def toString = "(%s < %s > %s)" format (left.getOrElse("o"), key(node), right.getOrElse("o"))
    }

    关于scala - 类型参数化或结构子类型化或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670946/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com