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

时间:2016-12-13 23:43:29

标签: scala generics variadic-functions abstract-data-type

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

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收到可变数量的字符串。

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

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

顺便说一下,我还可以将branches: List[Tree[A]]转换为branches: Tree[A]*之类的内容。从设计角度来看这是否有意义?

1 个答案:

答案 0 :(得分:3)

您可以在签名中使用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 = ???
}