为什么我不能与 Node[T] 进行模式匹配?
object Visitor {
def inorder[T](root: Node[T]) : Unit = {
root match {
case End => return;
case Node[T] => {
if( root.left != null )
inorder( root.left )
println( root.toString );
inorder( root.right );
}
case _ => return;
}
}
}
UPDATE:
该代码是逐字复制的99 个 Scala 问题
我收到这个编译时错误:
BinaryTree.scala:25: '=>' expected but '[' found.
[error] case Node[T] => {
[error] ^
[error] one error found
25号线指向该线
case Node[T] => {
You can在某些情况下绑定类型参数。绑定此类类型参数可用于对模式匹配子句的主体进行类型检查——由于擦除,这些绑定会被擦除,这意味着您无法在运行时区分它们(此类内容在 .NET CLR 中是可能的)。
不过,您的代码似乎没有使用该类型 - 人们需要查看 Node、End 的定义。实现您想要的简单方法可能是忽略 Node[T] 的类型参数是什么。下面是一个使用正确语法执行此操作的示例。
请注意,如果您想编写与某种类型(通用或非通用)匹配的模式,它始终具有以下形式v : T
。另一方面,如果您匹配案例类,则模式具有以下形状C(p1...,pN)
。语言规范包含所有详细信息。
而不是将类型绑定到类型变量a
,我们也可以将它绑定到_
,以强调我们不使用这种类型。
trait Tree[+T]
abstract class Node[+T] extends Tree[T] {
def left: Tree[T]
def right: Tree[T]
}
object End extends Tree[Nothing]
object Visitor {
def inorder[T](root: Tree[T]) : Unit = {
root match {
case End => return;
case node:Node[a] => {
inorder( node.left ) // node.left has the type Tree[a]
println( node.toString );
inorder( node.right );
}
case _ => return;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)