gpt4 book ai didi

scala - `++` - 两个数组上的运算符在使用类型参数时返回 ArraySeq

转载 作者:行者123 更新时间:2023-12-01 00:20:21 25 4
gpt4 key购买 nike

我试图实现一个简单的二叉树,这就是我想出的:

object main {

class Node[A]

case class EmptyNode[A](value: A) extends Node [A]

case class NonEmptyNode[A](left: Node[A], right: Node[A]) extends Node[A]

def traverse[A](tree: Node[A]): Array[A] = tree match {
case NonEmptyNode(l: Node[A], r: Node[A]) => traverse(l) ++ traverse(r)
case EmptyNode(v: A) => Array(v)
}

def main(args: Array[String]): Unit = {
val binaryTree =
NonEmptyNode(
NonEmptyNode(
EmptyNode("He"),
EmptyNode("llo ")
),
NonEmptyNode(
EmptyNode("Wor"),
EmptyNode("ld")
)
)

val output = traverse(binaryTree).reduce((a, b) => a + b)

println(output)
}
}

现在我想知道为什么它不起作用,告诉我:
Error:(11, 62) type mismatch;
found : scala.collection.mutable.ArraySeq[A]
required: Array[A]
case NonEmptyNode(l: Node[A], r: Node[A]) => traverse(l) ++ traverse(r)

而当我修复 A成为 String ,例如,它确实有效:
object main {

class Node

case class EmptyNode(value: String) extends Node

case class NonEmptyNode(left: Node, right: Node) extends Node

def traverse(tree: Node): Array[String] = tree match {
case NonEmptyNode(l: Node, r: Node) => traverse(l) ++ traverse(r)
case EmptyNode(v: String) => Array(v)
}

def main(args: Array[String]): Unit = {
val binaryTree =
NonEmptyNode(
NonEmptyNode(
EmptyNode("He"),
EmptyNode("llo ")
),
NonEmptyNode(
EmptyNode("Wor"),
EmptyNode("ld")
)
)

val output = traverse(binaryTree).reduce((a, b) => a + b)

println(output)
}
}

导致打印“Hello World”。

最佳答案

因为对 A 类型一无所知, 一个 Array[A]无法构建。因为它不能构造Array[A]两个 Array[A] s,它回落到 ArraySeq反而。

如果真的要建数组,必须提供ClassTagA :

object main {

class Node[A]

case class EmptyNode[A](value: A) extends Node [A]

case class NonEmptyNode[A](left: Node[A], right: Node[A]) extends Node[A]

import scala.reflect.ClassTag
def traverse[A: ClassTag](tree: Node[A]): Array[A] = tree match {
case NonEmptyNode(l, r) => traverse(l) ++ traverse(r)
case EmptyNode(v) => Array(v)
}

def main(args: Array[String]): Unit = {
val binaryTree =
NonEmptyNode(
NonEmptyNode(
EmptyNode("He"),
EmptyNode("llo ")
),
NonEmptyNode(
EmptyNode("Wor"),
EmptyNode("ld")
)
)

val output = traverse(binaryTree).reduce((a, b) => a + b)

println(output)
}
}

打印:
Hello World

原因 Array[A]如果没有关于 A 的附加信息,则无法构建是 Array[A]根据 A 的大小可以有不同的运行时表示:对于 bool 值、整数、长整数或 Object 会有所不同s。如果你想避免有 ClassTag在您的代码中随处可见,不要使用低级数组,而是使用一些真正通用的集合。

关于scala - `++` - 两个数组上的运算符在使用类型参数时返回 ArraySeq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49197172/

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