2016-12-13 72 views
1

我有一个简单的抽象数据类型树。具有泛型类型的可变长度参数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]*。从设计的角度来看,这是否有意义?

回答

3

您可以在签名中使用的序列,那么你将能够通过可变参数功能

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 = ??? 
} 
+0

去测试它,这是有道理的,不是你的回答 –

+0

顺便说一下,可我也做'branches:List [Tree [A]]''像'branches:Tree [A] *'。 从设计的角度来看,这是否有意义? –

+0

当你想要一个接受n个元素作为参数的函数时,可变参数是有意义的,但是当你声明一个类的字段时它的意义不大。但是它取决于你使用它。 – Mikel

相关问题