具有泛型类型的可变长度参数scala

variable length arguments with generic types scala

我有一个简单的抽象数据类型,一棵树。

sealed trait Tree[A]
case object EmptyTree extends Tree[Nothing]
case class Leaf[A](value: A) extends Tree[A]
case class Node[A](op: A => A, branches: List[Tree[A]]) extends Tree[A]

如何使 Node 持有的操作接受可变长度的 A 类型参数?

一个例子:

def printAll(strings: String*) {
  strings.foreach(println)
}

printAll 接收可变数量的字符串。

以同样的方式,我想让我的树持有 A* => A 类型的操作 op

一种可能的方法是让它接收 List[A],但我想知道是否有更直接的方法来做到这一点。


顺便问一下,我也可以将 branches: List[Tree[A]] 变成 branches: Tree[A]* 之类的东西吗?从设计的角度来看,这有意义吗?

你可以在签名中使用Seq,这样你就可以传递varargs函数了

sealed trait Tree[A]
case object EmptyTree extends Tree[Nothing]
case class Leaf[A](value: A) extends Tree[A]
case class Node[A](op: Seq[A] => A, branches: List[Tree[A]]) extends Tree[A]

object Test {
  Node[String](test[String], List())

  def test[A](elem: A*): A = ???
}